一尘不染

如何基于Content-type添加响应头;在提交响应之前获取Content-type

tomcat

我想Expires为所有image/*和设置标题text/css。我在做这个Filter。然而:

  • 在调用chain.doFilter(..)Content-type 之前尚未“实现”
  • 调用chain.doFilter(..)Content-type之后,设置了content-length,但是设置了content-length,它禁止添加新的标头(至少在Tomcat实现中)

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

因此,有没有一种方法可以在提交响应之前获取Content-type。


阅读 469

收藏
2020-06-16

共1个答案

一尘不染

是的,实施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));
2020-06-16