session存储在服务端,jsessionId存在客户端,每次通过jsessionid
取出保存的数据问题:但是正常情况下session
不可跨域,它有自己的作用范围
分布式session共享解决方案
session要能在不同服务和同服务的集群的共享
1.session复制
用户登陆获取session,服务吧session也复制到别的机器上
2.hash一致性
根据用户,到指定的机器上登录。但是远程调用还是不好解决
3.redis统一存储
最终的选择方案,把session放到redis中
-
由于默认使用jdk进行序列化,通过导入
RedisSerializer
修改为json序列化 -
并且通过修改
CookieSerializer
扩大session
的作用域至**.gulimall.com
-
springsession核心原理-使用了装饰器模式,在sessionRepositoryFilter
-
原生的获取
session
时是通过HttpServletRequest
获取的 -
这里对request进行包装,并且重写了包装request的
getSession()
方法
问题1:我们有sessionId不就可以了吗?为什么还要在session中放到User对象?
为了其他服务可以根据这个user查数据库,只有session的话不能再次找到登录session的用户
问题2:threadlocal的作用?
他是为了放到当前session的线程里,threadlocal就是这个作用,随着线程创建和消亡。把threadlocal定义为static的,这样当前会话的线程中任何代码地方都可以获取到。如果只是在session中的话,一是每次还得去redis查询,二是去调用service还得传入session参数,多麻烦啊
问题3:cookie怎么回事?不是在config中定义了cookie的key和序列化器?
序列化器没什么好讲的,就是为了易读和来回转换。而cookie的key其实是无所谓的,只要两个项目里的key相同,然后访问同一个域名都带着该cookie即可。