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

标签 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 行,并且我将其包含在我所有的 jsp 内部 body 标记中。这不适用于某些 jsps。注销后停止缓存需要考虑哪些事项。如果 jsp 具有带有 Post 方法的表单,则此技术不起作用?。

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

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

谢谢。

最佳答案

I am including this in all my jsps inside body tag

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


顺便说一句,您将相同的代码行复制粘贴到多个文件中,这是一个巨大的设计错误。这不是 DRY .每当您需要复制粘贴代码时,您应该总是停下来问问自己是否没有一个地方来执行特定代码。在您的特定情况下,您应该使用 Filter反而。有关具体示例,另请参阅此答案:Prevent user from seeing previously visited secured page after logout .此外,在 JSP 中编写 Java 代码是一种不好的做法。检查How to avoid Java code in JSP files?

还有,你的登出方法很奇怪。不要将用户名存储在某些自定义 cookie 中。您基本上是在重新发明 session 。只需将登录用户存储为 session 属性,然后使整个 session 无效并发送重定向。

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

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

关于java - 注销后单击后退按钮缓存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10330336/

相关文章:

delphi - 如何清除嵌入式 Chromium 浏览器的缓存和 cookie?

java - java 中月份结束的星期几的名称和开始日期的名称

caching - clojure.core.cache 只是使用他们自己的例子不起作用

java - 如何从oracle集合中检索clob数据

java - 在 Tomcat (JSP) 上为我的 webapp 使用一个类, "The import my_matrix cannot be resolved"

java - 如何从java中的所有 Activity session 中清除 session 属性?

java - 从 JSP 更改 linux 的 PWD

c# - 从 Global.asax 全局启用缓存

java - 在 java 中的 try-catch block 之后使用 "finally"有什么好处?

java - 在上传到 Google App Engine 之前如何打包我的类(class)