gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:14:24 26 4
gpt4 key购买 nike

我想向 HttpServletResponse 添加一个 cookie在其内容(通常是 HTML)被呈现之后。

正如这里提到的( http://osdir.com/ml/java.jasig.uportal/2005-10/msg00276.html ),
在这里( Adding a cookie to the response in Java after the header has been flushed? ),这可以通过缓冲响应来实现,这样它就不会被刷新并发送到客户端(因为在将 header 发送到客户端后,响应被提交,并且没有更多的 header ,即 cookie header ,可以发送给客户)。

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

public class BufferedHttpServletResponse extends HttpServletResponseWrapper {

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

public void flushBuffer() {
}

}

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

}

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

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

请赐教。谢谢。

最佳答案

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

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

  • 查询请求并采取相应措施。
  • 阻止请求和响应对进一步传递。
  • 修改请求头和数据。您可以通过提供一个
    请求的自定义版本。
  • 修改响应头和数据。 您可以通过提供一个
    响应的自定义版本。

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

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

    查看您的代码,您尝试做的是修改原始响应而不是修改自定义响应,并且哪个(将 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);
    }
    }

    关于servlets - 在 FilterChain.doFilter() - HttpServletResponseWrapper 之后添加 Cookie 以忽略刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12155879/

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