代码之家  ›  专栏  ›  技术社区  ›  Bozho

如何根据内容类型添加响应头;在提交响应之前获取内容类型

  •  8
  • Bozho  · 技术社区  · 15 年前

    我想设置 Expires 全部标题 image/* text/css . 我在做这个 Filter . 然而:

    • 打电话之前 chain.doFilter(..) 内容类型尚未“实现”
    • 打电话之后 链式过滤器(…) 内容类型已设置,但内容长度也已设置,这禁止添加新的头(至少在tomcat实现中是这样)

    我可以使用所请求资源的扩展名,但是由于一些css文件是由richfaces从jar文件中获取而生成的,所以文件名不是 x.css 但是 /xx/yy/zz.xcss/DATB/... .

    所以,在提交响应之前是否有方法获取内容类型。

    2 回复  |  直到 15 年前
        1
  •  13
  •   BalusC    15 年前

    是,执行 HttpServletResponseWrapper 超驰 setContentType() .

    class AddExpiresHeader extends HttpServletResponseWrapper {
        private static final long ONE_WEEK_IN_MILLIS = 604800000L;
    
        public AddExpiresHeader(HttpServletResponse response) {
            super(response);
        }
    
        public void setContentType(String type) {
            if (type.startsWith("text") || type.startsWith("image")) {
                super.setDateHeader("Expires", System.currentTimeMillis() + ONE_WEEK_IN_MILLIS);
            }
            super.setContentType(type);
        }
    }
    

    使用方法如下:

    chain.doFilter(request, new AddExpiresHeader((HttpServletResponse) response));
    
        2
  •  2
  •   laz    15 年前

    你应该继承 HttpServletResponseWrapper 超驰 addHeader setHeader 在“content type”作为头名称传入时添加新需要的头。确保不要忘记在那些被重写的方法中调用super。用这个新包装器包装dofilter方法参数中发送的响应,并将包装器传递给对dofilter的调用。