在过滤器中添加标题响应? [英] Adding header in response in filter?

查看:217
本文介绍了在过滤器中添加标题响应?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  public class MyFilter extends OncePerRequestFilter {

@Override
protected void doFilterInternal(HttpServletRequest请求,
HttpServletResponse响应,FilterChain filterChain)
抛出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 你可以扩展。例如:
$ b $ pre $ public class MyResponseRequestWrapper extends HttpServletResponseWrapper {
public MyResponseRequestWrapper(HttpServletResponse response){
super响应);


$ / code $ / pre
$ b $您的过滤器:

  @Override 
protected void doFilterInternal(HttpServletRequest请求,
HttpServletResponse响应,FilterChain filterChain)
抛出ServletException,IOException {

HttpServletResponse myResponse =(HttpServletResponse)响应;
MyResponseRequestWrapper responseWrapper = new MyResponseRequestWrapper(myResponse);
responseWrapper.addHeader(Access-Control-Allow-Origin,*);
filterChain.doFilter(request,myResponse);
}


I need to add the header in each response. I am planning to do below

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", "*"); 
    }

}

I would like to do it after filterChain.doFilter(request, response) so that once controller process it, i just add header before returning to client. Is it correct ?

But As per How to write response filter?

After chain.doFilter has returned, it's too late to do anything with the response. At this point, entire response was already sent to the client and your code has no access to it.

Above statement does not look right to me. Can't i add header after filterChain.doFilter(request, response) ? If not why ?

i am using spring mvc.

解决方案

After filterChain.doFilter is called it's too late to do anything with the response. At this point, the entire response was already sent to the client.

You need to build a wrap response into your own classes, pass these wrappers into doFilter method and handle any processing in your wrappers.

There is already a response wrapper: HttpServletResponseWrapper that you can extend. For example:

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

Your 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);
}

这篇关于在过滤器中添加标题响应?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆