Servlets 在FilterChain.doFilter()-HttpServletResponseWrapper之后添加Cookie以忽略刷新?

Servlets 在FilterChain.doFilter()-HttpServletResponseWrapper之后添加Cookie以忽略刷新?,servlets,cookies,servlet-filters,flush,Servlets,Cookies,Servlet Filters,Flush,在呈现内容(通常是HTML)之后,我想将cookie添加到HttpServletResponse 如本文所述(), 在这里(),可以通过缓冲响应来实现这一点,这样就不会刷新响应并将其发送到客户机(因为在将头发送到客户机之后,将提交响应,并且不能向客户机发送更多的头,即cookie头) 假设这是目前的目标:我认为实现这一目标的一种可能方法是使用HttpServletResponseWrapper,我可以覆盖它的flushBuffer()方法,并防止将头\内容实际刷新到客户端: public cla

在呈现内容(通常是HTML)之后,我想将cookie添加到
HttpServletResponse

如本文所述(), 在这里(),可以通过缓冲响应来实现这一点,这样就不会刷新响应并将其发送到客户机(因为在将头发送到客户机之后,将提交响应,并且不能向客户机发送更多的头,即cookie头)

假设这是目前的目标:我认为实现这一目标的一种可能方法是使用
HttpServletResponseWrapper
,我可以覆盖它的
flushBuffer()
方法,并防止将头\内容实际刷新到客户端:

public class BufferedHttpServletResponse extends HttpServletResponseWrapper {

    public BufferedHttpServletResponse(HttpServletResponse response) {
        super(response);
    }

    public void flushBuffer() {
    }

}
并将此缓冲响应应用于
过滤器
,以便过滤器链的其余部分使用:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    BufferedHttpServletResponse bufferedResponse = new BufferedHttpServletResponse(response);

    chain.doFilter(request, bufferedResponse);

    // ... create Cookie and add it to response ... response.addCookie(newCookie)
    // response.flushBuffer() ?        

}
问题:以上是可以的,还是完全关闭了?在my
doFilter()
退出之前,响应的缓冲区是否会一直充满内容\标题(可能会重新调整大小),然后由其他过滤器或servlet容器(Tomcat)刷新并发送到客户端?我应该自己刷新响应吗。。。这里提到()流不应该关闭,但在这种情况下应该刷新响应吗

不一定假设这是当前的目标:我的一般问题是需要为客户端浏览器设置cookie,但cookie的值取决于呈现响应内容时发生的内容(Struts 1.0操作中发生的内容,以及之后在Velocity模板中发生的内容)-我只在经历了整个(Servlet->呈现HTML)流之后才知道要设置什么cookie值


请开导我。谢谢。

看来没有人准备好接受这一点,我将尝试提供至少我的观点

在我开始回答您的问题之前,让我们先看看servlet过滤器的主要任务

  • 查询请求并相应地采取行动
  • 阻止请求和响应对进一步传递
  • 修改请求头和数据。您可以通过提供 请求的自定义版本
  • 修改响应头和数据您可以通过提供 响应的自定义版本。
资料来源:

现在回到您的问题,您可以通过自定义响应a.k.a
ResponseWrapper
来修改响应标题

查看您的代码,您试图做的是修改原始响应,而不是修改自定义响应,而自定义响应(将cookie添加到原始响应中)是不正常的

因此,正确的做法是将cookie添加到您的自定义文件中,如下面的示例所示

私有类CustomResponseWrapper扩展了HttpServletResponseWrapper{
私有集合mycokies=new ArrayList();
公共CustomResponseWrapper(HttpServletResponse){
超级(响应);
}
@凌驾
公共void addCookie(Cookie Cookie){
super.addCookie(cookie);
添加(cookie);
}
}

感谢您的提醒,但是如果这是上述代码背后的想法,我不会尝试捕获由过滤器链的其余部分创建的cookie(我在过滤器的.doChain()调用后制作了一个cookie,只想确保它到达客户端)。如何防止过滤器链的其余部分刷新\关闭响应,以便添加cookie?另外-我认为将cookie添加到原始响应或包装响应是相同的,因为调用包装响应的.addCookie()默认为调用原始响应的.addCookie()