分布式session

session存储在服务端,jsessionId存在客户端,每次通过jsessionid取出保存的数据问题:但是正常情况下session不可跨域,它有自己的作用范围

 
 
分布式session会话共享_redis
 
 
 
 
 

分布式session共享解决方案

session要能在不同服务和同服务的集群的共享

1.session复制

用户登陆获取session,服务吧session也复制到别的机器上

 
 
分布式session会话共享_序列化_02

2.hash一致性

 

根据用户,到指定的机器上登录。但是远程调用还是不好解决

 
 
分布式session会话共享_redis_03
 
 
 
 
 

3.redis统一存储

最终的选择方案,把session放到redis中

 
 
分布式session会话共享_spring_04
 
SpringSession整合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即可。