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回答

Jimin

2018-01-28

你好,这个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
2
Jimin
回复
丶J丶
哈哈,感谢你的认可,感觉课程不错记得给五星好评哦~
2018-01-28
共2条回复

Java开发企业级权限管理系统

源于企业真实Java项目,涉及大量高级技巧,覆盖权限管理开发技术

2261 学习 · 1347 问题

查看课程