为什么在注销后单击页面上的后退按钮会显示上一页内容?

时间:2014-03-25 11:11:07

标签: java jquery session struts2 cache-control

我正在开发一个Struts 2项目。当用户点击logout按钮时,logout操作会使用session.clear()清除会话。但是,当用户在注销后单击浏览器中的back按钮时,它仍会显示上一页内容。如果在注销后在浏览器中单击back按钮,我想将用户重定向到登录页面。

我的退出操作中还有其他什么可以解决这个问题吗? 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

在按下后退按钮之前,您的浏览器正在缓存页面。浏览器缓存机制旨在通过从页面具有相同URL获取本地缓存中的页面来最小化服务器访问时间。它可以显着减少数千个客户端浏览服务器时的服务器负载,并且似乎非常有用。但在某些情况下,特别是在您的情况下,内容应该更新。后退按钮的设计使其可以缓存用户正在浏览的每个页面,并在按下后退按钮时从本地缓存中检索它们。因此,解决方案是在返回带有控制浏览器缓存的特殊标头的响应时告诉浏览器不允许缓存。在servlet环境中,您可以使用过滤器来关闭缓存,但在Struts2中您可以使用自定义拦截器。例如

public class CacheInterceptor implements Interceptor {

private static final long serialVersionUID = 1L;

@Override
public void destroy() {}

@Override
public void init() {}

@Override
public String intercept(ActionInvocation invoication) throws Exception {
    HttpServletRessponse response = ServletActionContext.getResponse();
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Expires", "-1");
    return invoication.invoke();
}

}

现在您可以配置此拦截器以供每个操作

使用
<package name="default" extends="struts-default" abstract="true">

    <interceptors>
      <interceptor name="cache" class="org.yourcompany.struts.interceptor.CacheInterceptor "/>
      <interceptor-stack name="cacheStack">
        <interceptor-ref name="cache"/>
        <interceptor-ref name="defaultStack"/>
      </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="cacheStack"/>

</package>

当您的包扩展default包时,它们会继承拦截器和拦截器堆栈,您也可以通过操作配置覆盖此配置。

答案 1 :(得分:1)

这是因为您的浏览器缓存了客户端上的页面。

解决方案是通过强制浏览器即使按下“返回”按钮而不是阅读已保存的页面来强制浏览器请求新页面,以防止缓存该页面。

必读:

答案 2 :(得分:0)

我真的不知道struts。但尝试可能是在您需要登录的站点上停用缓存。

您还可以在注销功能中保存cookie或其他内容,主页检查AJAX是否设置了此cookie。如果它是你可以用JS重新加载页面(当然然后取消设置cookie)。