我有一个客户端缓存禁用过滤器,该过滤器映射到所有URL。
现在我必须专门禁用过滤器,并在响应有除html以外的任何内容时允许缓存。
我目前的过滤器代码如下:
public class NoCacheFilter implements Filter{
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("Pragma", "no-cache");
httpResponse.setHeader("Cache-Control","no-cache,no-store,max-age=0,s-maxage=0,must-revalidate,proxy-revalidate,private,max-stale=0,post-check=0");
httpResponse.setDateHeader("Expires", 0L);
filterChain.doFilter(request, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {}
}
注意:只是想知道我为什么要这样做的人 - 我们有一些分页会生成 PDF 。我们将此PDF文件刷新到输出流。在IE8中,刷新代码不起作用,日志显示the client closed the connetion immaturely...Cannot write to committed response...
。启用缓存后,PDF会正常写入客户端;没有任何问题。现有应用程序的一个单独要求是不允许在客户端上缓存任何页面。
答案 0 :(得分:1)
你有没有尝试过这么简单的事情:
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
filterChain.doFilter(request, response);
if(response.getContentType().indexOf("text/html")>-1){
httpResponse.setHeader("Pragma", "no-cache");
httpResponse.setHeader("Cache-Control","no-cache,no-store,max-age=0,s-maxage=0,must-revalidate,proxy-revalidate,private,max-stale=0,post-check=0");
httpResponse.setDateHeader("Expires", 0L);
}
}
它并没有真正禁用过滤器,但是当响应不是html时,至少过滤器不会做任何事情。
答案 1 :(得分:1)
简单,只需检查doFilter()方法是否可以缓存资源。您可以使用请求URI,内容类型或MIME类型。