会话注销/超时

时间:2011-03-03 11:03:10

标签: java jsf-2 session-timeout

简而言之,就是这样的情景:

  • 浏览器后退按钮必须正常运行(我正在使用JSF 2.0,所以这样做有效)

  • 注销后,如果用户点击后退按钮,应用必须将他/她重定向到登录页面(不工作,用户可以查看受保护的页面,虽然已过期。我不能包括meta标签禁用浏览器缓存,因为后退按钮停止工作)

  • 如果用户通过单击按钮调用某个操作,则应在其中一个过期页面上将其重定向到登录或错误页面(不工作,该应用程序会抛出错误并显示空白页面我的ExceptionHandlerWrapper实现检测到异常并且正在使用NavigationHandler来更改viewId并呈现响应(faces-config上的“facesException”映射指向login.jsf),但应用程序的行为不符合预期)

有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

  
      
  • 浏览器后退按钮必须正常运行(我正在使用JSF 2.0,所以这样做有效)

  •   
  • 注销后,如果用户点击后退按钮,应用必须将他/她重定向到登录页面(不工作,用户可以查看受保护的页面,虽然已过期。我不能包括meta标签禁用浏览器缓存,因为后退按钮停止工作)

  •   

解决此问题的两个步骤。

  1. 通过相应地设置响应标头来禁用浏览器缓存。您可以在映射到Filter上的FacesServlet中执行此操作。

    HttpServletResponse hsr = (HttpServletResponse) response;
    hsr.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    hsr.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    hsr.setDateHeader("Expires", 0); // Proxies.
    chain.doFilter(request, response);
    
  2. 不要使用HTTP POST进行页面到页面的导航。始终使用HTTP GET进行页面到页面的导航。如果您需要提交表单,请让它提交给自己(即让操作方法返回nullvoid)并使用h:messagesh:somecomponent rendered="#{success}"来显示相同​​的结果页面有条件。


  3.   
        
    • 如果用户通过单击按钮调用某个操作,则应在其中一个过期页面上将其重定向到登录或错误页面(不工作,应用程序会抛出错误并显示空白页面。我的ExceptionHandlerWrapper实现检测到异常并且正在使用NavigationHandler来更改viewId并呈现响应(faces-config上的“facesException”映射指向login.jsf),但应用程序的行为不符合预期)
    •   

    <error-page>上的javax.faces.webapp.ViewExpiredException已经足够了。另请参阅this answer