如何从ServletResponse获取内容类型?

时间:2018-12-17 19:13:18

标签: java

我正在实现一个覆盖doFilter方法的过滤器,以便在响应标头中插入一些“缓存控制”值。事实是,我只希望在响应中使用JSON内容类型设置值。在设置新的标头值之前,我尝试调用response.getContentType,但是它始终计算为null。

 @Override
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,
                     final FilterChain filterChain) throws IOException, ServletException {

    try {

        final HttpServletResponse response = (HttpServletResponse) servletResponse;

        if(response != null) {

            final HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(response);

            if(wrapper.containsHeader(HttpHeaders.CONTENT_TYPE)
                    && wrapper.getHeader(HttpHeaders.CONTENT_TYPE).equals("application/json")) {

                response.setHeader("Expires", "Mon, 23 Aug 1982 12:00:00 GMT");
                response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
            }
        }

    filterChain.doFilter(servletRequest, servletResponse);
    }

    catch(final Exception e) {
        LOG.error(e.getLocalizedMessage());
    }
}

1 个答案:

答案 0 :(得分:0)

servlet过滤器的困难在于,对于这种功能而言,它们的粒度太粗。 doFilter方法是“全有或全无”,即在响应之前中未设置任何内容,并且整个响应在之后已提交>它返回,因此添加任何标题为时已晚。

您可以做的是包装响应并在包装器中拦截setHeader方法,然后将其传递给doFilter。为此目的设计了一个辅助类HttpServletResponseWrapper