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)
| 归档时间: |
|
| 查看次数: |
3406 次 |
| 最近记录: |