请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

session不明白的地方

老师,用户输入账号密码后登陆,我们是保存用户信息到session的,但是

request.getSession().setAttribute("user", sysUser);

这里保存的string 都是“user”,是不是表示服务器都只保存一个名为“user”的session?假如还有其他人登陆那么就覆盖之前的吗?假如不覆盖,那么用getAttribute(),不是会有2个同名的session了么?可是只有一个名为“user”的session是怎么实现多个用户登陆互补干扰的呢?还有我知道不同的session都有唯一的sessionId,那么这里的“不同”是指的什么不用,名字不同(也就是上面说的“user”),还是什么不同~?希望详细和我说说它的原理,谢谢

正在回答

插入代码

1回答

你好,这个session是会话级别的,会话可以这么理解,当你打开浏览器访问一个网站时,就是一个会话。

正常情况下,在你关闭浏览器之前,不考虑时间过长会话失效,这个会话就不会发生变化,就是你这里说的sessionid一直是同一个,即便你过程中请求了很多请求,他们对应的都是同一个会话。

调用request.getSession.setAttribute("user", sysUser)时,其实服务框架那里就会根据当前的sessionid存储一些信息,可以理解成有一个map,map的key是sessionid,map的value还是一个map,value对应的map放置的信息是这里的<"user", sysUser>,然后使用时根据sessionid取出对应的map信息,再根据对应的"user"等关键字取出对应的sysUser。这样,同样的会话就可以获得到相同的用户信息了。

需要注意的是,sessionid在服务器端保存的信息是有时间限制的,可以通过一些设置修改。这就会出现,有时页面长时间不访问再刷新时,就需要重新登录,这就是因为sessionid在服务器端存储的信息已经失效了。

课程里原生实现部分使用的ThreadLocal原理和这个很像,但是ThreadLocal不会会话间隔离的,而是线程间隔离的,可以理解为每个请求存储的信息是分离的。这个学习到的时候可以多注意一下。

祝你学习愉快~

1 回复 有任何疑惑可以回复我~
  • 提问者 丶J丶 #1
    有师如此,真是我等的幸运,明白了老师!
    回复 有任何疑惑可以回复我~ 2018-01-28 16:43:14
  • Jimin 回复 提问者 丶J丶 #2
    哈哈,感谢你的认可,感觉课程不错记得给五星好评哦~
    回复 有任何疑惑可以回复我~ 2018-01-28 19:52:44
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号