我正在实现一个覆盖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());
}
}
答案 0 :(得分:0)
servlet过滤器的困难在于,对于这种功能而言,它们的粒度太粗。 doFilter
方法是“全有或全无”,即在响应之前中未设置任何内容,并且整个响应在之后已提交>它返回,因此添加任何标题为时已晚。
您可以做的是包装响应并在包装器中拦截setHeader
方法,然后将其传递给doFilter
。为此目的设计了一个辅助类HttpServletResponseWrapper。