代码如下:(Struts2的Action类,用来处理用户登录信息)
public class LoginAction
{
    public String execute()
    {
        if(登录成功)
        {
            User user = new User();     //User为自定义的一个用户类
            ... ...
            //给该user赋一些值
            ... ...
            ServletActionContext.getRequest().getSession(true).setAttribute("user",user);
         }
    }
}
session中保存的是user的一个引用,还是整个user信息?
如果只是“一个引用”的 ,那么我这个user是定义在一个方法内,它的有效范围只限于这个方法。因此出了这个方法我再对它进行防问就是不安全了,是这样吗?

解决方案 »

  1.   

    你把user放到session相当于是拷贝了一个user到session里, 这个时候你就算改变了user的值,session里的user还是你存进去的时候的值,而session的生命周期是整个web交互,所以就算你这个方法执行完了,只要没有关闭这个web应用,你同样可以使用session来得到你刚刚存进session的user而且,java里貌似没有传引用这一说法。
      

  2.   

    保存的應該是引用,但你可以通過session輕易訪問到user所有信息
    方法外安全性沒啥變化
    一樣能訪問到,因為引用被傳遞了
      

  3.   

    刚才看一下这个,http://hanolex.org/archives/249.html
    说的不错!
      

  4.   

    准确的说,要看你session中放什么类型的数值。放String的话,是不会改变的,因为是final的。放其他的,比如Object、List、Map等,则会改变,因为是同一个引用。
      

  5.   

    首先user是一个对象,也就是引用类型,凡是对引用类型的保存,都是copy一份它本身的引用。保存到Session中自然也不例外的是保存引用.至于你提到的安全性,Session本身就是在服务器上开辟一个内存,既然数据是保存在服务器上的,所以这样的访问是安全的。
    (后话)当然,如果你要让变量保存user里面的数据也可以让user去实现clone这个接口,然后去调用user.clone()把user对象里的数据保存一份到user类的另一个对象userb中,这时你对userb里面数据的任何操作就都不会影响到user了.