我想将 cookie 添加到HttpServletResponse
其内容(通常是 HTML)呈现后。
正如这里提到的(http://osdir.com/ml/java.jasig.uportal/2005-10/msg00276.html http://osdir.com/ml/java.jasig.uportal/2005-10/msg00276.html),
和这里 (刷新标头后,在 Java 中向响应添加 cookie? https://stackoverflow.com/questions/2158548/adding-a-cookie-to-the-response-in-java-after-the-header-has-been-flushed),这可以通过缓冲响应来实现,这样它就不会被刷新并发送到客户端(因为在标头发送到客户端之后,响应被提交,并且不再有标头,即 cookie 标头,可以发送到客户端)。
假设这是当前的目标:我认为实现这一目标的一种可能方法是使用HttpServletResponseWrapper
,我可以覆盖它的flushBuffer()
方法并阻止实际将 headers\content 刷新到客户端:
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)刷新并发送到客户端?我应该自己刷新响应吗? ...这里提到(应该在 HttpServletResponse.getOutputStream()/.getWriter() 上调用 .close() 吗? https://stackoverflow.com/questions/1159168/should-one-call-close-on-httpservletresponse-getoutputstream-getwriter)该流不应关闭,但在这种情况下是否应该刷新响应?
不一定假设这是当前的目标:我的一般问题是,我需要为客户端浏览器设置一个 cookie,但 cookie 的值取决于渲染响应内容时发生的事情(发生在 Struts 1.0 Action 中的事情,之后在 Velocity 模板中发生的事情) - 只有在完成整个(Servlet -> HTML 渲染)流程之后,我才知道要设置什么 cookie 值。
请赐教。谢谢。