我遇到了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,其中自定义会话是“初始”,而不是我设置的最后一个值。
答案 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之前将其传递给响应。