Tomcat:为1个请求多次设置cookie值?

时间:2009-09-10 13:34:46

标签: java jsp session tomcat cookies

我遇到了Apache Tomcat 6.0.20的问题,一旦将cookie添加到响应中,我就无法更改cookie的值。基本上,我正在尝试使用cookie复制会话功能。我有一个自定义的“Session”对象,它由cookie支持。当我创建Session时,我将它传递给HttpServletResponse,它会创建并在响应中添加一个空白cookie。然后,当我的代码调用Session.put()方法时,我想更改此cookie的值。

我所看到的是,一旦将cookie添加到响应中,对Cookie.setValue()的任何调用基本上都是无用的。使用调试器,我可以看到cookie本身正在被修改,但响应对象中的Set-Cookie头保持不变(它包含cookie的初始值,通常只是一个空字符串)。我甚至尝试创建一个新的cookie并将其重新添加到响应中,但这对Set-Cookie标头也没有影响。

奇怪的是,我正在使用几年前由我们自己的开发人员编写的库。过去我们使用的是JRun 3.1 Web服务器,所以我猜测每个Web服务器可能会以不同的方式处理这些cookie操作。

之前有没有人遇到这个问题?我现在唯一可以保证工作的解决方案是在我确定自己已完成自定义Session对象之前,不会将cookie添加到响应中。我可以创建一个名为Session.saveTo(HttpServletResponse)的方法,它将cookie添加到响应中。这样可行,但是我们的一些JSP可能非常复杂,所以我宁愿在每次放置时使用Session“自动保存”,以防我忘记调用Session.saveTo()。

澄清一下,这实际上就是我正在做的事情:

Cookie cookie = new Cookie("custom-session", "initial");
response.addCookie(cookie); // Set-Cookie header has 'custom-session=initial'

cookie.setValue("new value"); // does not change Set-Cookie header
response.addCookie(cookie); // re-adding the same cookie, does not work either

毕竟,我的浏览器创建了一个cookie,其中自定义会话是“初始”,而不是我设置的最后一个值。

2 个答案:

答案 0 :(得分:1)

事实证明,它是Tomcat 6中的一个错误/设计功能。我们的旧Web服务器JRun 3.1在响应提交之前没有创建Set-Cookie响应头。这意味着您可以在此之前随时修改所有Cookie。但是,查看源代码后,只要将cookie添加到响应中,Tomcat就会创建Set-Cookie标头。 Tomcat Response对象保留了Cookie对象的句柄,但对它们没有任何作用。

使用Tomcat,只要在响应中添加Cookie,就无法更改它。

答案 1 :(得分:1)

您的自定义Session应该在内部保存cookie,并且只在它返回Tomcat之前将其传递给响应。