我试图弄清楚如何在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无法恢复。
只有在“刷新”并重新发送后才能再次使用。
可能是什么原因?
答案 0 :(得分:3)
您需要指示浏览器不缓存JSF页面。创建一个映射为Filter
的{{1}}并在@WebFilter(servletNames={"facesServlet"})
方法中执行以下作业
doFilter()
这会强制浏览器在按下后退按钮时触发全新的GET请求。否则它只会从缓存中返回页面,然后表单提交将失败,因为服务器端视图状态因会话失效而丢失。