与servlet会话混淆

时间:2014-11-20 06:45:11

标签: java session servlets

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

假设我已将对象添加到用户会话中。

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"

2 个答案:

答案 0 :(得分:2)

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

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

注意:

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

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

答案 1 :(得分:0)

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