在理解Servlet过滤器一文中有下图:
我理解的是,request从客户端发送过来后经过filter处理后传递给web应用;服务器做响应后发出response,response经过filter处理后传递给客户端。
可是当我在web应用中对进行以下处理后
response.reset();
response.setContentType("text/html;charset=utf-8" );
然后在filter中设置
httpResponse.setHeader("Access-Control-Allow-Origin", "*");
结果在客户端respones的header中没有"Access-Control-Allow-Origin":"*"这条属性。
如果把response.reset();注释掉就有了,可这个和上面的结论不是矛盾吗?
客户端是啥?过滤器是拦截所有满足拦截条件的请求,然后放行或者其他操作。跟response有啥关系
你给出的filter的执行流程是正确的,你的理解也是正确的,关键是response.reset()操作。
reset方法会清除所有缓冲区的数据包含状态码和响应头,所以导致你后来设置的响应头信息失效了。
API如下:
reset():
Clears any data that exists in the buffer as well as the status code and headers. If the response has been committed, this method throws an IllegalStateException.