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

blo*_*ell 6 cookies servlets flush servlet-filters

我想HttpServletResponse在其内容(通常是HTML)呈现之后添加cookie .

正如这里所提到的(http://osdir.com/ml/java.jasig.uportal/2005-10/msg00276.html),这里(在刷新标题后,在Java中为响应添加一个cookie?),这个可以通过缓冲响应来实现它不会被刷新并发送到客户端(因为在将报头发送到客户端之后,响应被提交,并且不再有标头,即cookie头,可以发送到客户端).

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

public class BufferedHttpServletResponse extends HttpServletResponseWrapper {

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

    public void flushBuffer() {
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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() ?        

}
Run Code Online (Sandbox Code Playgroud)

问题:上面还可以,还是完全关闭?响应的缓冲区是否会继续填充内容\标题(并且可能会重新调整大小)直到我doFilter()退出之后,然后刷新并通过其他过滤器或servlet容器(Tomcat)发送给客户端?我应该自己刷新回复吗?...这里提到(应该在HttpServletResponse.getOutputStream()/.getWriter()上调用.close()吗?)该流不应该关闭,但是在这种情况下是否应该刷新响应?

不一定假设这是手头的目标:我的一般问题是我需要为客户端浏览器设置cookie,但cookie的值取决于呈现响应内容时发生的事情(Struts 1.0中发生的事情)动作,然后在Velocity模板中) - 我知道在完成整个(Servlet - > HTML渲染)流之后我想要设置的cookie值.

请赐教.谢谢.

Ram*_*m G -2

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

在回答您的问题之前,首先让我们看一下 servlet 过滤器的主要任务。

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

来源: http: //docs.oracle.com/javaee/6/tutorial/doc/bnagb.html

现在回到您的问题,您可以通过自定义响应(又名)来修改响应标头ResponseWrapper。

查看您的代码,您想要做的是修改原始响应而不是修改自定义响应,并且(将 cookie 添加到原始响应)是不行的。

因此,正确的方法是在您的自定义中添加 cookie,如下例所示。

   private class CustomResponseWrapper extends HttpServletResponseWrapper {

        private Collection<Cookie> myCookies = new ArrayList<Cookie>();

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

        @Override
        public void addCookie(Cookie cookie) {
            super.addCookie(cookie);
            myCookies.add(cookie);
        }
    }
Run Code Online (Sandbox Code Playgroud)