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

标签 java jsp session tomcat cookies

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

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

奇怪的是,我使用的是我们自己的开发人员几年前编写的库。过去我们使用 JRun 3.1 网络服务器,所以我猜可能每个网络服务器处理这些 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,其中 custom-session 是“inital”,而不是我设置的最后一个值。

最佳答案

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

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

关于java - Tomcat:为 1 个请求多次设置 cookie 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1405350/

相关文章:

java - 根据 xml 模式生成 Web 表单

javascript - 在多个页面上使用按键导航脚本

php - Xampp 中的 PHP session 问题

php - 此脚本的安全性

java - 让编码员监听变化?

java - 为什么 tomcat7.0.47 在将前端 Controller servlet 映射到 *.do 或/或/* 的 URL 模式时无法访问静态资源(js、css)

java - 为什么在这种特殊情况下向 JList 添加元素会使其为空?

返回类数组的java方法

javascript - 如何读取从 Controller 作为排序列表返回的 JavaScript 对象的值

session - CakePHP 3 丢失身份验证 session