更新 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/