2

我想弄清楚如何在 Glassfish 3.1 中的 JSF 登录表单上防止会话固定。使用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。

它只有在“刷新”并重新发送后才能再次工作。

这可能是什么原因?

4

1 回答 1

3

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

HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(req, res);

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

于 2011-05-22T13:55:43.963 回答