1

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

4

2 回答 2

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 时过滤器不会做任何事情。

于 2013-10-07T08:48:28.533 回答
1

很简单,只需在 doFilter() 方法中检查资源是否可缓存。您可以为此使用请求 URI、内容类型或 MIME 类型。

于 2013-10-07T08:50:02.360 回答