小编典典

在过滤器中添加响应头?

spring-mvc

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

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)以便一旦控制器处理它,我只需在返回客户端之前添加标头即可。这是对的吗 ?

之后chain.doFilter又回来了,这是来不及做的任何回应。此时,整个响应已发送到客户端,您的代码无法访问它。

以上声明对我而言并不正确。之后filterChain.doFilter(request, response)是否可以添加标题?如果不是为什么?

我正在使用Spring MVC。


阅读 1313

收藏
2020-06-01

共1个答案

小编典典

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

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

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

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

您的过滤器:

@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);
}
2020-06-01