注销后单击后退按钮缓存问题
Posted
技术标签:
【中文标题】注销后单击后退按钮缓存问题【英文标题】:after logout click on back button cache issue 【发布时间】:2012-05-07 00:05:21 【问题描述】:<%
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
%>
注销后,如果您单击返回按钮,则会在登录页面上显示旧页面。这不适用于某些 jsps 。注销后停止缓存需要考虑哪些事项。如果一个jsp有一个带有Post方法的表单,这种技术不起作用?。
在我的注销操作中,我正在这样做。
Cookie logoutCookie = new Cookie("somename", null);
logoutCookie.setPath("/somename");
logoutCookie.setMaxAge(0);
ServletActionContext.getResponse().addCookie(logoutCookie);
谢谢。
【问题讨论】:
【参考方案1】:创建一个会话属性,让我们说“有效”,并在登录凭据匹配后使用 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();”在 logout.jsp 中
希望它会工作..!!!
【讨论】:
【参考方案2】:我将这个包含在我所有的 jsps 内的 body 标记中
当 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
【讨论】:
在不允许页面被缓存后,我在 Firefox 中收到文档过期消息。这是我返回页面的时候,这是 POST 请求的某些操作的结果。什么是最好的解决方案。我不能在这里使用 GET,谢谢。 答案是发送重定向,但既然是 GET,故事就结束了。忍受它,这就是 POST 的工作原理。【参考方案3】:如果您使用浏览器的后退按钮,则无能为力。该页面将始终来自缓存。
只需确保在用户单击注销时使会话无效。这样,当用户点击“返回”并尝试使用该页面时,他将被重定向到登录页面(如果您的网站编程正确)。
[编辑]
这是我们为 http 1.1 放置的没有缓存的标头:
httpResponse.setHeader("Cache-Control", "private,no-store,no-cache");
【讨论】:
我这里没有使用会话。我只使用 Cookie 来获取登录用户的详细信息。 好吧,不管有没有会话,您是在谈论浏览器的后退按钮还是应用程序中的某个后退按钮? @Tom::我的注销按钮是一个 Ajax 调用..ajax 调用结束后,它会重定向到登录页面..我可以在我的 Ajax 调用上设置“no-cache”选项吗请求?【参考方案4】:你试过response.setHeader("Cache-control","no-store");
response.setHeader("Pragma","no-cache");
response.setDateHeader("Expires", -1);
吗?我认为您在正确的位置缺少引号..
【讨论】:
'不适用于某些页面'并没有真正的帮助。你每次都让这个人登录吗?有过滤器在运行吗?首先如何检查用户是否经过验证?以上是关于注销后单击后退按钮缓存问题的主要内容,如果未能解决你的问题,请参考以下文章
CodeIgniter Log Out 在单击后退按钮或键入快捷链接时注销后仍然可以访问该页面
当用户在 JSF 中注销后单击后退按钮时重定向到登录页面 [重复]