在过滤器中添加响应头?
我需要在每个响应中添加标题。我打算在下面做
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。
回答:
filterChain.doFilter
被调用之后,对响应进行任何操作为时已晚。此时,整个响应已经发送给客户端。
您需要在自己的类中构建包装响应,将这些包装传递给doFilter
方法,并处理包装中的所有处理。
已经有一个响应包装器:HttpServletResponseWrapper
您可以扩展。例如:
public class MyResponseRequestWrapper extends HttpServletResponseWrapper{ public MyResponseRequestWrapper(HttpServletResponse response) {
super(response);
}
}
您的过滤器:
@Overrideprotected 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);
}
以上是 在过滤器中添加响应头? 的全部内容, 来源链接: utcz.com/qa/431989.html