gpt4 book ai didi

java - 响应正在提交并且 doFilter 链已断开

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:01 25 4
gpt4 key购买 nike

为了这就是我需要发生的事情:

请求 blah.com/test

  1. ServletFilter A - 创建配置文件,然后调用 chain.doFilter
  2. ServletFilter B(因为 url 模式不匹配而被跳过)
  3. Servlet - 改变配置文件,repsonse.setStatus & response.addHeader("Location", target)
  4. ServletFilter A - 应该根据配置文件创建一个 cookie

实际发生了什么:

  1. ServletFilter A - 创建配置文件,然后调用 chain.doFilter
  2. ServletFilter B(因为 url 模式不匹配而被跳过)
  3. Servlet - 改变配置文件,repsonse.setStatus & response.addHeader("Location", target)
  4. Redirect 已提交,ServletFilter A 未完成任务

我认为这可能与您可以在 ServletFilter 配置中设置的调度程序值有关。

有什么想法吗?

最佳答案

我认为响应在 第 4 步 到达 ServletFilter A 时已提交。一旦响应被提交,即标题被写入客户端,您将无法执行需要添加标题的操作。添加 cookie 等操作。

如果您希望在 Step 4 之前不提交响应,请尝试包装 HttpServletResponse 并返回您的自定义输出流,该流缓冲数据直到它到达 step 4 然后提交响应。

示例代码如下:

public class ResponseBufferFilter implements Filter
{
public void init(FilterConfig filterConfig) throws ServletException
{
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException
{
HttpServletResponse httpResponse = (HttpServletResponse)response;
BufferResponseWrapper wrapper = new BufferResponseWrapper(httpResponse);
filterChain.doFilter(request, resposneWrapper);
response.getOutputStream().write(wrapper .getWrapperBytes());
}

public void destroy()
{
}

private final class BufferResponseWrapper extends HttpServletResponseWrapper
{

MyServletOutputStream stream = new MyServletOutputStream();

public BufferResponseWrapper(HttpServletResponse httpServletResponse)
{
super(httpServletResponse);
}

public ServletOutputStream getOutputStream() throws IOException
{
return stream;
}

public PrintWriter getWriter() throws IOException
{
return new PrintWriter(stream);
}

public byte[] getWrapperBytes()
{
return stream.getBytes();
}
}

private final class MyServletOutputStream extends ServletOutputStream
{
private ByteArrayOutputStream out = new ByteArrayOutputStream();

public void write(int b) throws IOException
{
out.write(b);
}

public byte[] getBytes()
{
return out.toByteArray();
}

}
}

关于java - 响应正在提交并且 doFilter 链已断开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11025605/

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