根据响应禁用过滤器

时间:2013-10-07 08:37:18

标签: java servlets pdf-generation servlet-filters

我有一个客户端缓存禁用过滤器,该过滤器映射到所有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会正常写入客户端;没有任何问题。现有应用程序的一个单独要求是不允许在客户端上缓存任何页面。

2 个答案:

答案 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类型。