相信大家有过如此困扰吧?
客户端浏览器因为缓存的原因,有时候页面是旧的。 很恼火,我相信很多人的解决方案无非就是以下两种:
1.在jsp页面meta标记no-cache
2.request中设置header
但这样做是有弊端的。显而易见,不管是按方案1还是方案2,都需要在每一个JSP页面进行类似设置。 那有没有可以只用设置一次,就可以取消客户端页面缓存的呢? 当然有!
使用strust2栏截器,对页面所有访问的action进行拦截,并且设置response的header属性,就大功告成,具体代码:
拦截器的定义及全局调用(需引用默认拦截器)
<interceptors>
<interceptor name="changeUrlInterceptor" class="com.main.action.AddUrlTimeFlag"></interceptor>
<interceptor-stack name="changeUrlInterceptorStack">
<interceptor-ref name="changeUrlInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="changeUrlInterceptorStack"></default-interceptor-ref>
拦截器自定义实现类AddUrlTimeFlag.java
package com.main.action;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
/**去掉缓存的拦截器*/
public class AddUrlTimeFlag implements Interceptor{
public void destroy() {}
public void init() {}
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("进入栏截器");
ActionContext actionContext = arg0.getInvocationContext();
HttpServletResponse response =(HttpServletResponse)actionContext.get(StrutsStatics.HTTP_RESPONSE);
response.setDateHeader("expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
return arg0.invoke();
}
}
一般在项目里,我们常拿拦截器判断非正常登陆、权限分配等等,不过加入去掉缓存的几行代码也不碍事,是吧?