HttpSession传递持久化了的对象数据的一点问题!

观鱼塘主 2013-11-19 11:10:22
一般网站登陆之后会在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中的对象自动同步了?
...全文
133 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
teemai 2013-11-19
  • 打赏
  • 举报
回复
session 底层是map实现的。 所以你把key和value理解成map的就很清楚了。
观鱼塘主 2013-11-19
  • 打赏
  • 举报
回复
引用 2 楼 defonds 的回复:
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 中对象的复制
斑竹帮我大忙了! 我之前就是做C++的,关于这点上一直有点模糊,现在明白了! 听君一席话,胜读十年书!
Defonds 2013-11-19
  • 打赏
  • 举报
回复
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 中对象的复制

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧