我有一个自定义标签,可以进行一些处理,然后设置一个cookie。但是,cookie没有设置,我无法弄清楚原因。另一位开发人员指出,因为我们正在使用模板系统,即标签评估的点,所以响应头已经作为include的一部分被刷新。由于标头已被发送,因此无法添加cookie(但是,当我尝试执行此操作时,不会抛出任何状态异常)。有没有解决的办法?听起来这可能是问题吗?
答案 0 :(得分:1)
就像其他人说的那样,你真的想避免首先要做到这一点。你可能想要一个很好的MVC类型的模型,你有一些servlet可以完成繁重的工作,比如数据库和cookie等等,然后将控制权传递给实际呈现响应的JSP。由于在servlet完成之前不会调用JSP来生成HTML,所以不应该像这样悲伤。
setCookie在失败时没有告诉你,这有点蹩脚,但也可能你不希望它打破你的整个页面。 ServletResponse.isCommitted()将告诉您标头是否已经写入,因此如果您的setCookie()调用失败。
如果你处于困境并且绝对需要能够做到这一点(当你寻找更好的解决方案时),你可以创建一个servlet过滤器来缓冲内存中的响应,直到你的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我的朋友。
答案 1 :(得分:0)
嗯,HTTP cookie是HTTP标头的一部分,所以这肯定是你的问题。因此,在刷新HTTP标头后,您根本无法编写cookie。
您正在刷新而不使用响应缓冲的任何特定原因?或者,尝试确保修改标头并在刷新之前添加cookie。
答案 2 :(得分:0)
我想可能的解决方法是发出JavaScript来设置cookie。这种方法当然存在明显的问题。类似的技巧是包含一个1x1像素的webbug,可以在加载时设置cookie。
我建议仅在创建页面视图时保持JSP(和类似)。并且保持非常少的会话状态。
答案 3 :(得分:0)
HTTP也知道在按照标题(相同格式)处理正文之后添加的页脚。不幸的是,HttpServletResponse没有addFooter方法(例如Resin API)。没有api会很难。没有机会简单地将它添加到身体 - 将被解析为身体,而不是页脚。遗憾。
如果您为浏览器编写html,也许您可以在页面末尾(</html>
之前)添加一段javascript来设置cookie。