注销后单击后退按钮缓存问题

时间:2012-04-26 09:05:40

标签: java jsp caching logout

<%
    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行以上,并且我在body标签内的所有jsps中都包含了这一行。这对某些jsps不起作用。在loggout之后我们需要考虑什么才能停止缓存。如果一个带有Post方法的表单的jsp,这种技术不起作用?。

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

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

感谢。

4 个答案:

答案 0 :(得分:2)

如果您使用浏览器中的后退按钮,则无法执行任何操作。该页面将始终来自缓存。

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

[编辑]

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

httpResponse.setHeader("Cache-Control", "private,no-store,no-cache");

答案 1 :(得分:2)

  

我将其包含在body标签内的所有jsps

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


在一个不相关的说明中,你通过在多个文件上复制相同的代码行来犯下巨大的设计错误。这不是DRY。每当您需要复制代码时,您应该始终停下来问自己是否没有单个位置来执行特定代码。在您的特定情况下,您应该使用Filter代替。有关具体示例,请参阅此答案:Prevent user from seeing previously visited secured page after logout。此外,在JSP中编写Java代码是一种不好的做法。查看How to avoid Java code in JSP files?

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

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

有关会话工作的背景信息,请阅读:How do servlets work? Instantiation, sessions, shared variables and multithreading

答案 2 :(得分:0)

你试过response.setHeader("Cache-control","no-store"); response.setHeader("Pragma","no-cache"); response.setDateHeader("Expires", -1);吗?我想你错过了正确位置的引号..

答案 3 :(得分:0)

创建一个会话属性,让我们说&#34;有效&#34;在匹配登录凭据之后,在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文件即可。不要忘记写&#34; session.invalidate();&#34;在logout.jsp

希望它能运作.. !!!