【问题标题】: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);

谢谢。

【问题讨论】:

    标签: java jsp caching logout


    【解决方案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 &lt;head&gt;。您需要将这些行放在 JSP 文件的最顶部,而不是 HTML 表示的 &lt;body&gt; 中。


      在不相关的说明中,您将相同的代码行复制粘贴到多个文件中,这是一个巨大的设计错误。这不是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);吗?我认为您在正确的位置缺少引号..

      【讨论】:

      • '不适用于某些页面'并没有真正的帮助。你每次都让这个人登录吗?有过滤器在运行吗?首先如何检查用户是否经过验证?
      猜你喜欢
      • 2023-03-29
      • 2018-08-03
      • 1970-01-01
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2015-04-21
      • 2012-05-12
      相关资源
      最近更新 更多