刷新标头后,在Java中为响应添加cookie?

我有一个自定义标签,可以进行一些处理,然后设置一个cookie。 但是,cookie没有设置,我无法弄清楚原因。 另一位开发人员指出,因为我们正在使用模板系统,即标签评估的点,所以响应头已经作为include的一部分被刷新。 由于标头已被发送,因此无法添加cookie(但是,当我尝试执行此操作时,不会抛出任何状态exception)。 有没有解决的办法? 听起来这可能是问题吗?

像其他人说的那样,你真的想避免首先要做到这一点。 你可能想要一个很好的MVC模型,你有一些servlet可以完成繁重的工作,比如数据库和cookie等等,然后将控制权传递给实际呈现响应的JSP。 由于在servlet完成之前不会调用JSP来生成HTML,因此不应该像这样陷入悲痛之中。

setCookie在失败时没有告诉你,这有点蹩脚,但也可能你不希望它打破你的整个页面。 ServletResponse.isCommitted()将告诉您标头是否已经写入,因此如果您的setCookie()调用失败。

如果你处于困境并且绝对需要能够做到这一点(当你寻找更好的解决方案时),你可以创建一个servletfilter来缓冲内存中的响应,直到你的cookie被设置为止。 模式将是这样的:

doFilter(request, response, chain) { BufferedResponse bufferedResponse = new BufferedResponse(response); try { // pass control to the next filter or to the JSP/servlet servicing the request chain.doFilter(request, bufferedResponse); } finally { bufferedResponse.flush(); } } 

BufferedResponse需要实现HttpServletResponse并基本上将所有内容保存在内存中,直到您明确刷新它。 此时它会写出标题,cookie和缓冲的响应主体。

这将完全起作用,但它会导致您的Web服务器使用一堆额外的内存,因为它必须在内存中为每个请求缓冲整个响应主体。 此外,由于服务器无法开始向客户端浏览器发送任何内容,直到您的页面完全完成后,您的页面加载速度会变慢。 坏juju我的朋友。

好吧,HTTP cookie是HTTP头的一部分,所以这肯定是你的问题。 因此,在刷新HTTP标头后,您根本无法编写cookie。

您正在刷新而不使用响应缓冲的任何特定原因? 或者,尝试确保修改标头并在刷新之前添加cookie。

我想一个可能的解决方法是发出JavaScript来设置cookie。 这种方法当然存在明显的问题。 一个类似的技巧是包括一个1×1像素的webbug,它在加载时设置一个cookie。

我建议只关注创建页面视图的JSP(和类似的)。 并且保持非常少的会话状态。

HTTP也知道在按照标题(相同格式)处理正文之后添加的页脚。 不幸的是,HttpServletResponse没有addFooter方法(例如Resin API)。 没有api会很难。 没有机会简单地将它添加到身体 – 将被解析为身体,而不是页脚。 抱歉。

如果您为浏览器编写html,也许您可​​以在页面末尾(在之前)包含一段javascript来设置cookie。