在会话失效后单击浏览器后退按钮时防止ViewExpiredException

时间:2011-05-22 13:43:36

标签: jsf servlets glassfish back-button viewexpiredexception

我试图弄清楚如何在Glassfish 3.1中的JSF登录表单上阻止Session Fixation。 使用Servlets很容易,所以我尝试对JSF做同样的事情(基于这个问题:Retrieving session ID value from a JSF request):

FacesContext fCtx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
session.invalidate();   
fCtx.getExternalContext().getSession(true); 

它似乎有效,但当我点击浏览器的后退按钮并重新输入登录详细信息时,我得到:

  

javax.faces.application.ViewExpiredException:   viewId:/index.xhtml - 查看   /index.xhtml无法恢复。

只有在“刷新”并重新发送后才能再次使用。

可能是什么原因?

1 个答案:

答案 0 :(得分:3)

您需要指示浏览器缓存JSF页面。创建一个映射为Filter的{​​{1}}并在@WebFilter(servletNames={"facesServlet"})方法中执行以下作业

doFilter()

这会强制浏览器在按下后退按钮时触发全新的GET请求。否则它只会从缓存中返回页面,然后表单提交将失败,因为服务器端视图状态因会话失效而丢失。