一尘不染

如何正确地使JSP会话无效?

jsp

所以这就是问题所在。当用户退出我的网站时,他们仍然可以点击“后退”按钮并继续使用该网站。为了跟踪用户是否已登录,我创建了一个会话属性“
isActive”。当用户登录时,该属性设置为true,并且在注销会话无效之前(冗余)删除该属性。同样在每个页面上,我检查属性是否存在。

我还指定不应将页面缓存在其head标签中。

尽管如此,用户仍然可以在浏览器上进行回退,并且可以像从未登录过一样继续使用该网站。

关于如何解决此问题的任何想法?

这是代码:

登录Servlet:

...
session.setAttribute("isActive", true);
//Redirect to home page.

检查已登录的JSP:

<c:if test='${empty sessionScope.isActive || sessionScope.isActive != true}'>
     <c:redirect url="/index.jsp?message=Session Timed Out."/>
</c:if>

注销Servlet:

request.getSession().removeAttribute("isActive");
request.getSession().invalidate();
response.sendRedirect("index.jsp");

内头标签:

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">

谢谢


阅读 428

收藏
2020-06-08

共1个答案

一尘不染

元标记还不够。您需要将它们添加为有价值的响应标头。Web浏览器依赖于它们。A Filter在这方面很有帮助。此外,Cache- Control标头不完整(在Firefox中无法正常使用)。

例如,通过映射到的doFilter()方法来实现此目的(如果您想覆盖所有JSP页面)。Filter``url-pattern``*.jsp

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

这样,Web浏览器将被迫在服务器上触发实际请求,而不是显示来自浏览器缓存的页面。另外,您应该使用a Filter来检查已登录用户的存在,而不是JSP /
JSTL。

2020-06-08