session不明白的地方
来源:8-4 用户登录接口与界面开发-1

丶J丶
2018-01-27
老师,用户输入账号密码后登陆,我们是保存用户信息到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不会会话间隔离的,而是线程间隔离的,可以理解为每个请求存储的信息是分离的。这个学习到的时候可以多注意一下。
祝你学习愉快~
122018-01-28
相似问题