在filter中添加标头响应?

我需要在每个响应中添加标头。 我打算在下面做

public class MyFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { filterChain.doFilter(request, response); response.addHeader("Access-Control-Allow-Origin", "*"); } } 

我想在filterChain.doFilter(request, response)之后执行它filterChain.doFilter(request, response)这样一旦控制器处理它,我只需在返回客户端之前添加头。 这是对的吗 ?

但按照如何编写响应filter?

chain.doFilter返回之后,对响应做任何事都为时已晚。 此时,整个响应已发送到客户端,您的代码无法访问它。

以上陈述对我来说不合适。 我不能在filterChain.doFilter(request, response)之后添加标头吗? 如果不是为什么?

我正在使用spring mvc。

filterChain.doFilter之后,对响应执行任何操作都为时已晚。 此时,整个响应已经发送给客户端。

您需要在自己的类中构建一个包装响应,将这些包装器传递给doFilter方法并处理包装器中的任何处理。

已有一个响应包装器:您可以扩展的HttpServletResponseWrapper 。 例如:

 public class MyResponseRequestWrapper extends HttpServletResponseWrapper{ public MyResponseRequestWrapper(HttpServletResponse response) { super(response); } } 

你的filter:

 @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { HttpServletResponse myResponse = (HttpServletResponse) response; MyResponseRequestWrapper responseWrapper = new MyResponseRequestWrapper(myResponse); responseWrapper.addHeader("Access-Control-Allow-Origin", "*"); filterChain.doFilter(request, myResponse); } 

从完美的文章

修改响应的filter通常必须在响应返回到客户端之前捕获响应。 为此,您将一个替代流传递给生成响应的servlet。 备用流阻止servlet在完成时关闭原始响应流,并允许filter修改servlet的响应。

要将此替换流传递给servlet,filter会创建一个响应包装器,它会覆盖getWriter或getOutputStream方法以返回此替换流。 包装器传递给filter链的doFilter方法。 包装器方法默认调用包装的请求或响应对象。 这种方法遵循设计模式中描述的众所周知的Wrapper或Decorator模式,