JSF ออกจากระบบและหน้าหมดอายุ

ฉันใช้อัลกอริธึมการล็อกเอาต์ด้านล่างในแอปพลิเคชัน JSF ของฉัน และมันทำงานในขณะที่ผู้ใช้สามารถออกจากระบบได้และเซสชันถูกยกเลิก

อย่างไรก็ตาม ปัญหาของฉันคือแม้ว่าผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบ แต่เมื่อเขา/เธอกดปุ่มย้อนกลับของเบราว์เซอร์ เขายังสามารถดูข้อมูลก่อนหน้าได้

@ManagedBean
@RequestScoped
public class LogoutBean {
  public String logout() {
    String result="/faces/pages/public/login.xhtml?faces-redirect=true";

    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();

    try {
      request.logout();
    } catch (ServletException e) {
        log.info("Error during logout!");
    }
    return result;
  }
}

มีวิธีกำหนดค่านี้ในลักษณะที่เบราว์เซอร์จะแสดงเพจหมดอายุหรือไม่โดยใช้ตรรกะด้านบน


person Mark Estrada    schedule 07.11.2012    source แหล่งที่มา
comment
เป็นไปได้ที่ซ้ำกันของ หลีกเลี่ยงปุ่มย้อนกลับในแอปพลิเคชัน JSF + Primefaces   -  person BalusC    schedule 08.11.2012
comment
อ๊ะ ขออภัยสำหรับความเป็นไปได้ที่ซ้ำกัน...   -  person Mark Estrada    schedule 08.11.2012


คำตอบ (1)


คุณควรปิดการใช้งานแคชของเบราว์เซอร์สำหรับเพจที่คุณไม่ต้องการให้ปุ่มย้อนกลับแสดงอีกครั้ง เมื่อต้องการทำเช่นนี้ คุณสามารถสร้างตัวกรองเซิร์ฟเล็ตที่ตั้งค่าพารามิเตอร์ที่จำเป็นในส่วนหัวการตอบกลับสำหรับเพจเหล่านั้น:

@WebFilter(servletNames={"Faces Servlet"})
public class NoCacheFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
            res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            res.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            res.setDateHeader("Expires", 0); // Proxies.
        }

        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }
}

ด้วยวิธีนี้ เมื่อผู้ใช้กดปุ่มย้อนกลับของเบราว์เซอร์ เพจนั้นจะถูกร้องขออีกครั้งจากเซิร์ฟเวอร์

person Mohammad Dehghan    schedule 07.11.2012