java - 更新 session 数据的正确语义

标签 java jsp session servlets

更新 session 中保存的对象的正确方法是什么?我必须始终对从 session 中检索到状态已更改的对象调用 setAttribute() 吗?我在这里仅指已已创建并存储在 session 中的 session 属性,而不是新属性。

假设我的 session 中存储了一个 Person 对象,并且每个请求都会:

Person p = (Person) session.getAttribute("person");

那么“p”引用的对象始终是跨请求返回给您的同一个对象。容器(至少是 Tomcat)不会每次都给你一个新的副本。这里的要点是,如果您随后执行 p.setName("Joe the Plumber") 并且不调用 setAttribute("person", p),则该对象将保留 session 中的内容仍然会更新,您将看到跨请求的更新。

但是,一旦集群和 session 复制开始发挥作用,您通常必须始终调用 setAttribute() 以便集群代码能够知道何时分发更新的 session 对象。我确实意识到某些容器有其他机制可以在不调用 setAttribute() 的情况下实现此目的。

这是 Servlet 规范的灰色地带吗?

最佳答案

是的,这是一个灰色地带。 J2EE 规范通常不讨论使用集群时的预期行为。

有一个针对 Servlet 规范的增强请求: https://java.net/jira/browse/SERVLET_SPEC-1

请随意添加您对应该在该问题的规范中添加哪些内容(如果有的话)的看法。

关于java - 更新 session 数据的正确语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19306662/

相关文章:

java - 遍历对象层次结构

javascript - 从打印页面中删除 url 和打印文本

java - (n>3) 维度的 Delaunay 三角剖分

java - 错误: Could not find or load main class

Java Web 应用程序 - 将 scriptlet 重构为最佳实践方法

javascript - 如何在 JavaScript 中获取动态(JSP)创建的 <select> 部分中的选项数量?

php - 如何在php中的每个href点击上设置新 session

javascript - 当用户在 php 中打开的选项卡之一注销时自动注销所有打开的选项卡

node.js - session 存储在哪里? (ExpressJS)

java - jacob.dll 已经加载到另一个类加载器中