【问题标题】:Tomcat: Set cookie value multiple times for 1 request?Tomcat:为 1 个请求多次设置 cookie 值?
【发布时间】:2009-09-11 00:19:12
【问题描述】:

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

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

奇怪的是,我使用的是我们自己的开发人员几年前编写的库。过去我们使用 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 是“初始”,而不是我设置的最后一个值。

【问题讨论】:

  • 看起来像 Apache Tomcat/6.0.20

标签: java jsp session tomcat cookies


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是的,这就是我现在要使用的解决方案。从长远来看,我认为更好的解决方案可能是坚持使用 HttpSession 并配置 Tomcat 的会话集群,以便我们的应用可以扩展到多个服务器。
    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2018-02-27
    • 2012-03-17
    • 1970-01-01
    相关资源
    最近更新 更多