gpt4 book ai didi

java - 在 doFilter 调用后设置响应 header

转载 作者:行者123 更新时间:2023-12-02 06:02:58 27 4
gpt4 key购买 nike

因此,我一直在观察有关此主题的一些答案,并且我知道在 doFilter() 调用完成后,现在修改响应 header 已经太晚了,为了最好地处理这种情况,我应该使用响应包装器。

我想知道如何处理这样的情况:如果已冒泡回过滤器的响应具有特定的状态代码,我只想设置 header 。该逻辑应该在 doFilter 之前处理吗?在请求包装类中?我有点困惑。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest;
HttpServletResponse servlettResponse = (HttpServletResponse)response;
CrossOriginResponseWrapper crossOriginResponseWrapper = new CrossOriginResponseWrapper(servlettResponse);
if (crossOriginResponseWrapper.getStatus() == 404) {
crossOriginResponseWrapper.addHeader("Access-Control-Allow-Origin", "*");
}
chain.doFilter(request, crossOriginResponseWrapper);


LOG.info(crossOriginResponseWrapper.getHeader("Access-Control-Allow-Origin"));

LOG.info(servlettResponse.getStatus());
}

更新:

这是解决包装器中的重写方法的唯一方法,以便响应在到达我的过滤器之前不会被写入/刷新吗?有没有更简单的解决方案?

(引用这个答案) Response is committing and doFilter chain is broken

最佳答案

不行,这是唯一的办法。这里有一个工作示例。 https://github.com/sercasti/spring-httpserver-timings/blob/master/src/main/java/io/github/sercasti/tracing/filter/TracingFilter.java

我用包装器包装原始响应,从而避免其他过滤器调用 .write 方法,该方法会立即提交响应并阻止您添加 header 。

通过使用此包装器,其他过滤器写入我的包装器,然后当我的过滤器取回控制权时,我添加 header ,并有效地写入原始响应。

关于java - 在 doFilter 调用后设置响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55962059/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com