【问题标题】:Confusion with servlet session [closed]与servlet会话混淆[关闭]
【发布时间】:2015-01-17 22:45:27
【问题描述】:

看起来像一个简单的查询,但想清楚。

假设我在用户会话中添加了一个对象。

AClass aObj = new AClass();
aObj.setValue("a");
request.getSession().setAttribute("aSessionName", aObj);

现在,如果我在下面的行中对对象进行更改,我将其保存在会话中,例如:

aObj.setValue("b");

在此之后,如果我尝试从会话中检索 AClass 对象,例如:

AClass bObj = (AClass)request.getSession().getAttribute("aSessionName");

会话是否会返回具有 "a""b" 值的 AClass 对象?

【问题讨论】:

  • 是什么阻止您继续尝试?
  • @Unihedron:我想知道原因。

标签: java session servlets


【解决方案1】:

当您将对象添加到会话时,将存储对象的引用。它不会被克隆,因此相同的对象将保留在您拥有的会话中。

因此,如果它们相同,并且您在将对象放入会话后调用setValue("b"),因为它们是相同的,所以您正在修改同一个对象。因此,当您下次从会话中获取它时,它将具有值 "b"

注意:

这里有一点需要注意。会话可能会在服务器重新启动之间持久化到磁盘;或者,如果您有多个集群服务器,则会话(及其属性)可能会在服务器之间传输。在这种情况下,存储在会话中的属性值可能不是同一个引用。

建议:当你想修改一个存储在会话中的对象时,你应该总是先从会话中获取它,修改它然后重新设置它。

【讨论】:

    【解决方案2】:

    这取决于。如果您的应用程序包含非常多的会话,那么它可能会序列化其中的一些以释放内存。因此,如果您的会话被序列化和反序列化,那么您将拥有另一个值为“a”的 AClass 实例。

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      相关资源
      最近更新 更多