当前位置: 首页 > 面试题库 >

响应正在提交并且doFilter链已损坏

谢高峯
2023-03-14
问题内容

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

要求 blah.com/test

  1. ServletFilter A-创建配置文件,然后调用 chain.doFilter
  2. ServletFilter B(由于网址格式不匹配而被跳过)
  3. Servlet-更改配置文件,repsonse.setStatus以及response.addHeader("Location", target)
  4. ServletFilter A-应基于配置文件创建cookie

实际情况:

  1. ServletFilter A-创建配置文件,然后调用 chain.doFilter
  2. ServletFilter B(由于网址格式不匹配而被跳过)
  3. Servlet-更改配置文件,repsonse.setStatus以及response.addHeader("Location", target)
  4. 重定向已提交,ServletFilter A未完成任务

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

有任何想法吗?


问题答案:

我认为,当它到达响应得到承诺ServletFilter AStep 4。提交响应后,即将标头写入客户端,便无法执行需要添加标头的操作。这些操作类似于添加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();
    }

}
}


 类似资料:
  • 当我尝试使用Spring boot和Spring mvc下载压缩文件时,出现了一个错误: null 基本上,我的应用程序是加载一个文件,压缩它并下载新的压缩文件。 这是我的应用程序控制器: 如果我关闭输入和输出流,我不知道为什么会发生这种情况。

  • 我试图创建一个api的商店以下属性:StoreId,名称,位置,电话,产品列表(ProductId,对象,价格,股票),产品列表的大小 问题是,当存储区与列表中的项目不一致时,它会以以下方式响应: 但是,如果所有的商店都没有项目,就没有问题,但是如果所有的商店都没有项目,api就没用了。

  • 我正在阅读https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/connectors/datastream/kafka/#kafka-消费者补偿提交行为配置 它说: 启用检查点:如果启用了检查点,Flink Kafka使用者将在检查点完成时提交存储在检查点状态中的偏移量。这确保了Kafka代理中提交的偏移量与检查点状态中

  • 我们有一个场景,提交给ThreadPoolExecitor的任务长时间运行。当线程池启动时,我们以核心池大小=5、最大池大小=20和队列大小为10启动它。在我们的应用程序中,大约有10个任务被提交。大多数时候,这些任务运行几分钟/小时,然后完成。但是有一种情况,所有5个任务都挂在I/O上。因此,我的核心池大小达到了最大值,但我的ThreadpoolExector队列未满。所以额外的5个任务从未有机

  • 我正在使用一个表单并提交一个表单,其中包括名字、姓氏、电子邮件、用户名等字段。当ajax返回时,它返回一个错误消息字符串。如何分离该错误消息?我正在使用这个代码