2014-06-30 31 views
1

在我的web应用程序中,当用户注销时,他不应该访问他以前在他登录时查看的页面。但是,由于浏览器缓存,他可以在单击后退按钮时查看这些页面。如何在struts2中禁止缓存?

我定义一个拦截器来处理这个问题:

public String intercept(ActionInvocation invocation) throws Exception { 
     // TODO Auto-generated method stub 

     final ActionContext context = invocation.getInvocationContext(); 
     HttpServletResponse response = (HttpServletResponse)context.get(StrutsStatics.HTTP_RESPONSE); 
     if(response!=null){ 
      response.setHeader("Cache-control", "no-cache, no-store"); 
      response.setHeader("Pragme", "no-cache"); 
      response.setHeader("Expires", "-1"); 

     } 

     return invocation.invoke(); 
    } 

struts.xml

<interceptors> 

    <interceptor name="cachingHeadersInterceptor" class="com.prosonsulto.interceptor.CachingHeadersInterceptor"/> 
    <interceptor-stack name="defaultSecurityStack"> 
    <interceptor-ref name="defaultStack"/> 
    <interceptor-ref name="cachingHeqadersInterceptor"/> 
    </interceptor-stack> 

    </interceptors> 

会发生什么事是,添加此之后,我得到一个404错误,当我运行我的应用程序。

我尝试添加的响应头的网页:

<%response.setHeader("Cache-Control", "no-cache"); 
response.setHeader("Cache-Control", "no-store"); 
response.setDateHeader("Expires", -1); 
response.setHeader("Pragma", "no-cache"); 
%> 

但将是乏味必须将它添加到一个个的所有网页。此外,用户可以随时进行表单重新提交并再次访问这些页面,而无需实际输入他的登录凭据。

理想情况下,我应该做些什么来防止浏览器缓存?

因为你已经在你的代码中的错误,你修复错误,你可以使用后,您不能应用此拦截,
+0

感谢您的问题/答案,但请记住,您的网站可能存在安全问题。如果用户在没有登录的情况下“不应该有权访问”,但是“由于缓存”,尽管您禁用了该缓存,但用户仍然可以保存网页以在不必登录的情况下访问它(.. 。本地主机中的一种缓存)。你必须确保所有的服务都不可用于未登录的用户(即检查用户是否登录到每个服务中) – olivarra1

回答

1

改变此密码

response.setHeader("Pragme", "no-cache"); 

response.setHeader("Pragma", "no-cache"); 

它防止缓存。

+0

我不敢相信我犯了这样一个愚蠢的错误!非常感谢 (: – Saturnian