在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模式,