一.zookeeper解决分布式session问题
1.1session定义
当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。简单来说就是用于客户端与服务器通讯会话技术。
1.2session实现原理
客户向服务器端发送请求后,在服务器端创建 Session ,返回Sessionid给客户端浏览器保存在本地,当下次发送请求的时候,在请求头中传递sessionId获取对应的从服务器上获取对应的Sesison对象信息。
注意:HttpSession session = request.getSession(false);在获取session的时候需要穿入参数false(不会创建新的sessionID,这样才会获取到同一个sessionID)
2.分布式下产生session的原因
session是在服务器中创建的对象,而分布式情况下,在不同的服务器,就会有不同session的问题。
3.解决不同session的方案
- spring-session-data-redis + redis:将sessionID缓存在redis中。spring-session-data-redis包中已经帮忙处理好了,只需要导入对应的依赖,很方便的解决方法。(重要明确存在的问题,及解决原理)
- session存在本地cookie中(不推荐,不安全)
- token代替session,其实就是将值存入redis中,使用的时候在取出对应的value值。(redis在分布式中是可以共享的)