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

use*_*342 5 java session jquery struts2 cache-control

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

在我的注销行动中我还有什么要清楚解决这个问题吗?任何帮助将不胜感激.

Rom*_*n C 3

事实证明,在您按后退按钮之前,您的浏览器正在缓存页面。浏览器缓存机制的设计目的是,如果页面具有相同的 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();
}

}
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

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