看起来像一个简单的查询,但想要清楚。
假设我已将对象添加到用户会话中。
AClass aObj = new AClass();
aObj.setValue("a");
request.getSession().setAttribute("aSessionName", aObj);
现在,如果我在下面的行中创建并更改了一个对象,我将其保存在会话中,如:
aObj.setValue("b");
在此之后,如果我尝试从会话中检索AClass对象,如:
AClass bObj = (AClass)request.getSession().getAttribute("aSessionName");
会话会返回 AClass 对象,其值为" a" 或" b"
答案 0 :(得分:2)
将对象添加到会话时,将存储对象的引用。它不会被克隆,因此相同的对象将保留在您拥有的会话中。
因此,如果它们是相同的并且在您将对象放入会话后调用setValue("b")
,因为它们是相同的,您正在修改同一个对象。因此,当您下次从会话中获得它时,它将具有值"b"
。
注意:强>
有一点需要注意。服务器重启后,会话可能会持久保存到磁盘;或者如果您有多个服务器群集,则会话(及其属性)可以在服务器之间传输。在这种情况下,存储在会话中的属性值可能不是相同的引用。
建议:每当你想要修改会话中存储的对象时,你应该首先从会话中获取它,修改它然后重新设置它。
答案 1 :(得分:0)
这取决于。如果您的应用程序包含很多会话,那么它可能会将其中一些会话序列化以释放内存。因此,如果您的会话已序列化并反序列化,那么您将拥有另一个值为' a'的AClass实例。