所以问题来了。当用户退出我的网站时,他们仍然可以点击后退按钮继续使用该网站。为了跟踪用户是否登录,我创建了一个 session 属性“isActive”。该属性在用户登录时设置为 true,并在注销时 session 失效之前(冗余地)被删除。同样在每个页面上,我检查该属性是否存在。
我还指定页面不应缓存在它们的 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">
谢谢
最佳答案
元标记不够。您需要将它们添加为完全有值(value)的响应 header 。网络浏览器依赖于它们。 Filter
对此很有帮助。此外,Cache-Control
header 不完整(在 Firefox 等中无法按预期工作)。
在 Filter
的 doFilter()
方法中实现它,它映射到 url-pattern
例如 * .jsp
(如果你想覆盖所有的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);
这样,网络浏览器将被迫在服务器上触发一个真正的请求,而不是从浏览器缓存中显示页面。此外,您应该使用 Filter
来检查登录用户的存在,而不是 JSP/JSTL。
相关问题:
关于java - 如何正确地使 JSP session 失效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3902688/