日期:2014-05-17  浏览次数:20713 次

HttpSession传递持久化了的对象数据的一点问题!
一般网站登陆之后会在HttpSession中保存用户的名字或者ID---此为背景:
撸主今天试了下用HttpSession来传递对象,是被数据库持久化了的对象,代码如下:
@RequestMapping(value = "/azzurro", method = RequestMethod.POST)
public String login(@RequestParam("account") String account,
@RequestParam("password") String password,
HttpServletRequest request, ModelMap modelMap) throws Exception {

String loginFlag = null;
User user = userService.getByAccount(account);

HttpSession session = request.getSession();



if (user == null) {

loginFlag = "INVALID";

} else {

LoginInfo loginInfo = user.getLoginInfo();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String lastLoginDate = sdf.format(loginInfo.getLastLoginDate()); //获取用户上次登陆日期(测试用)
session.setAttribute("loginInfo", loginInfo);

if(!user.isActive()) {

modelMap.put("loginFlag", "LOCKED");
return "login";
} else if ("choiland".equals(password)) {

userService.login(user, request.getSession());
} else if (!userService.login(account, password, request)) {

loginFlag = "INVALID";
}
}

if (loginFlag == null) {

return "redirect:/authorized/index";
} else {

modelMap.put("loginFlag", loginFlag);
return "login";
}
}

然后我到另外一个Controller中去获取这个loginInfo,代码如下:
@RequestMapping(value = "/welcome")
public String welcome(HttpSession session, ModelMap modelMap) {

User user = userService.getCurrent(session);

modelMap.put("account", user.getAccount());
LoginInfo loginInfo = (LoginInfo) session.getAttribute("loginInfo");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String lastLoginDate = sdf.format(loginInfo.getLastLoginDate()); //这里取出来的日期却是当前的时间
modelMap.put("loginInfo", loginInfo);

return "/authorized/index/welcome";
}

问题:请问HttpSession中保存持久化对象时,保存的是引用还是直接复制数据?为什么我HttpSession中的对象自动同步了?
HttpSession?对象?引用

------解决方案--------------------
Java 中的赋值操作符与 C++ 中的不一样。在 C++ 中,这条语句:bc2 = bc1;将一个名为 bc1 的对象的所有数据都拷贝到名为 bc2 的对象中。也就是说这条语句执行后,程序中有两个含有相同数据的对象。然而在 Java 中,这条相同的赋值语句只向 bc2 中拷贝了 bc1 指向的存储地址,现在 bc1 和 bc2 实际上指的是同一个对象,它们都是这个对象的引用。这样大大提高了内存使用效率,同时也容易让一些对内存了解不深的朋友带来一些使用上的错误。比如 bc1.add(25);buc2.add(20);执行之后 bc1 增加了 45。而作者本意可能是只是让 bc1 增加 25,bc2 增加 20 而已。这说明了,在 Java 中,bc2 = bc1; 并不是真正意义上的复制。那么在 Java 中如何进行对象复制呢?请参考:
关于 Java 中对象的复制