session.invalidate()不';t实际清除JSF会话范围的值
我看到了这个问题中提到的类似问题- 我有一个会话范围的LoginBean,其中有一个操作注销为# 它几乎可以正常工作 输出#session.invalidate()不';t实际清除JSF会话范围的值,session,jsf,Session,Jsf,我看到了这个问题中提到的类似问题- 我有一个会话范围的LoginBean,其中有一个操作注销为# 它几乎可以正常工作 输出# {xyzBean=com.xyz.bean。XYZBean@46f046f0,…} 使会话无效 {} sessionMap为空表示没有会话作用域bean。然而,在注销操作之后,它会重定向到另一个相同的页面。登录是同一页面上的一层。我看到片段JSP仍然显示旧数据 我没有删除facade.removeCookie中的JSESSIONID。它会删除与用户相关的一些其他cooki
{xyzBean=com.xyz.bean。XYZBean@46f046f0,…}
使会话无效
{}
sessionMap为空表示没有会话作用域bean。然而,在注销操作之后,它会重定向到另一个相同的页面。登录是同一页面上的一层。我看到片段JSP仍然显示旧数据
我没有删除facade.removeCookie中的JSESSIONID。它会删除与用户相关的一些其他cookie
任何帮助都将不胜感激
谢谢。您可能正在查看从浏览器缓存提供的页面。您需要添加HTTP响应头,以指示webbrowser不缓存动态页面。您可以使用映射到感兴趣的
上的javax.servlet.Filter
来执行此操作,例如*.jsf
或其他什么,并在doFilter()
方法中执行以下工作:
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Cache-Control", "no-cache,no-store,must-revalidate"); // HTTP 1.1
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0
httpResponse.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(request, response);
不要忘记在测试之前清除浏览器缓存;)
与问题无关,代码中的
if(session!=null)
nullcheck是多余的,因为会话在到达该nullcheck时永远不能为null。如果它为null,它会在removeAttribute()
调用中抛出NullPointerException
,因此永远不会到达nullcheck。谢谢,这就成功了。此外,我还必须执行ec.redirect来代替导航。感谢我的检查点——如果我陷入困境,我有时会忽略这些事情P
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Cache-Control", "no-cache,no-store,must-revalidate"); // HTTP 1.1
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0
httpResponse.setDateHeader("Expires", 0); // Proxies.
chain.doFilter(request, response);