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

时间:2010-04-01 20:10:49

标签: java tomcat servlets

我想为所有Expiresimage/*设置text/css标头。我在Filter中这样做。但是:

  • 在致电chain.doFilter(..)之前,内容类型尚未“实现”
  • 调用chain.doFilter(..)后,设置了Content-type,但内容长度也是如此,禁止添加新标题(至少在Tomcat实现中)

我可以使用所请求资源的扩展名,但由于某些css文件是由richfaces通过从jar文件中获取而生成的,因此该文件的名称不是x.css,而是{ {1}}。

那么,有没有办法在提交响应之前获取Content-type。

2 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:2)

当“Content-Type”作为标题名称传入时,您应该子类HttpServletResponseWrapper并覆盖addHeadersetHeader以添加新需要的标头。确保不要忘记在那些被覆盖的方法中调用super。用这个新的Wrapper包装doFilter方法参数中发送的Response,并将Wrapper传递给对doFilter的调用。