2014-03-25 50 views
5

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

还有什么我应该清除我的注销行动来解决这个问题? 任何帮助将不胜感激。

回答

1

原来你按后退按钮前,您的浏览器缓存的网页。如果页面具有相同的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包它们继承了拦截器和拦截器栈来使用,也可以覆盖这个配置动作配置。

+0

+1,但我会搜索并用'NoCache'替换您的所有'Cache' –

+0

我已经选择了拦截器名称,但意图通过添加可能改变逻辑的参数来定制它,并在需要时打开或关闭缓存。 –

0

我不太了解struts。但尝试可能是在需要登录的网站上停用缓存。

您还可以在注销功能中保存cookie或其他内容,并且主页面会使用AJAX检查是否设置了此cookie。如果是的话,你可以用JS重新加载页面(当然也可以不设置cookie)。

+0

你应该多少次取消cookie的设置? –

+0

我没有做任何cookie,我只是清除了会话,当用户点击注销 – user2940342

相关问题