java - 如何正确地使 JSP session 失效?

标签 java security jsp session invalidation

所以问题来了。当用户退出我的网站时,他们仍然可以点击后退按钮继续使用该网站。为了跟踪用户是否登录,我创建了一个 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 等中无法按预期工作)。

FilterdoFilter() 方法中实现它,它映射到 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/

相关文章:

java - Lambda 表达式与方法引用实现细节

java - 是否可以在 O(1) 时间内进行搜索?

java ssl错误无法支持TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

php - 清理 $_POST 变量

android - 如何保护 Android 应用程序免受盗窃和应用程序本身的修改?

javascript - 从 JSP scriptlet 变量中检查单选按钮

java - 使用 Java 配置进行 Spring MVC Bean 验证

java - 包 org.jboss.netty.channel.socket.nio 不存在

java - Feed通过html tidy渲染jsp页面

java - 在哪里可以看到 Openshift 的控制台日志?