繁体   English   中英

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

[英]Tomcat: Set cookie value multiple times for 1 request?

我遇到了Apache Tomcat 6.0.20的问题,将Cookie的值添加到响应后便无法更改。 基本上,我正在尝试使用Cookie复制会话功能。 我有一个自定义的“会话”对象,该对象由cookie支持。 创建会话时,我将其传递给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.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,其中的自定义会话是“初始”,而不是我设置的最后一个值。

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

使用Tomcat,一旦将Cookie添加到响应中,就无法更改它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM