4
<%
    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); //prevents caching at the proxy server
%>

注销后,在登录页面上,如果您单击后退按钮,它会在登录时显示旧页面。我在 jsp 中使用了以上 3 行,并将其包含在我的所有 jsp 内 body 标记中。这不适用于某些 jsps 。注销后停止缓存需要考虑哪些事项。如果一个 jsp 有一个带有 Post 方法的表单,这种技术不起作用?

在我的注销操作中,我正在这样做。

Cookie logoutCookie = new Cookie("somename", null);
logoutCookie.setPath("/somename");
logoutCookie.setMaxAge(0);
ServletActionContext.getResponse().addCookie(logoutCookie);

谢谢。

4

4 回答 4

2

如果您使用浏览器的后退按钮,则无能为力。该页面将始终来自缓存。

只需确保在用户单击注销时使会话无效。这样,当用户点击“返回”并尝试使用该页面时,他将被重定向到登录页面(如果您的网站编程正确)。

[编辑]

这是我们为 http 1.1 设置的没有缓存的标头:

httpResponse.setHeader("Cache-Control", "private,no-store,no-cache");
于 2012-04-26T11:44:51.153 回答
2

我在body标签内的所有jsps中都包含了这个

当 HTTP 响应此时已经提交时,这可能为时已晚。当已经写入 X 数量的字符时,将提交 HTTP 响应,在您的情况下是 HTML <head>。您需要将这些行放在 JSP 文件的最顶部,而不是<body>HTML 表示中。


在不相关的说明中,您通过将相同的代码行复制粘贴到多个文件中而犯了一个巨大的设计错误。这不是DRY。每当你需要复制粘贴代码时,你应该停下来问问自己是否没有一个地方可以执行特定的代码。在您的特定情况下,您应该使用 aFilter代替。有关具体示例,另请参阅此答案:防止用户在注销后看到以前访问过的安全页面。此外,在 JSP 中编写 Java 代码是一种不好的做法。检查如何避免 JSP 文件中的 Java 代码?

另外,您的注销方法很奇怪。不要将用户名存储在某些自定义 cookie 中。你基本上是在重塑会话。只需将登录用户存储为会话属性,并使整个会话无效并发送重定向。

request.getSession().invalidate();
response.sendRedirect(request.getContextPath() + "/home.jsp");

有关会话工作的背景信息,请阅读以下内容:servlet 如何工作?实例化、会话、共享变量和多线程

于 2012-04-26T14:04:38.587 回答
0

Have you tried response.setHeader("Cache-control","no-store"); response.setHeader("Pragma","no-cache"); response.setDateHeader("Expires", -1);? I think your missing the quotes at the right place..

于 2012-04-26T09:20:11.387 回答
0

创建一个会话属性,让我们说“有效”,并在登录凭据匹配后使用 jsp 中除 null 以外的任何值对其进行初始化。现在使用以下代码创建一个 verify.jsp:

<%
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
if(session.getAttribute("valid")==null)
{
    out.println("<script>parent.location.href='login.jsp'</script>");
}
%>

现在只需在每个 jsp 页面上包含这个 jsp 文件并完成。不要忘记写“session.invalidate();” 在注销.jsp

希望它会工作..!!!

于 2014-08-28T09:20:44.790 回答