Session 共享实现
为什么要实现session共享呢
-
随着互联网公司的项目在微服务和分布式的环境下进行的搭建,导致一个项目可能分别部署在几个甚至很多的服务器集群下,此时就会出现一个问题:
-
当用户进行一个session会话的时候,比如一个用户去登录项目,一般的大公司的项目都是有Nginx进行反向代理的,但是这里简单列举一下Nginx常用的几种反向代理策略:1.轮询策略,2. 权重比例策略,3. ip_hash策略,4.fair策略,5. 还可以自定义的策略,在Nginx的反向代理下,一般会把用户的请求分发到不同的服务器上,但是如果用户请求的请求是存放在该请求的服务器A上,那么该用户的sessionID就存储在该服务器上JVM的一个ConcurrentHashmap中,以sessionID为key。
-
但是如果此时用户请求的一个服务模块可能需要调用到服务器B,当用户发起请求的时候,此时的服务器B上并没有存储该用户的sessionID,所以就会再次让用户进行一个登陆操作。还有可能会导致用户本来就想完成一个下单操作,但是却还登陆了好几次的情况。
-
所以session共享方案在分布式环境和微服务系统下,显得尤其重要。
实现session共享的几种方式:
-
基于Nginx的ip_hash 负载均衡
-
基于Tomcat的session复制
-
session放到cookie中去
-
使用Redis做缓存session的统一缓存
使用Redis做缓存session的统一缓存
本次主要实现的是第四种方式的实现(使用Redis做缓存session的统一缓存)
-
步骤: 在项目中导入Redis和Session-Redis依赖
<!--SpringBoot整合redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.6.4</version> </dependency> <!--Redis整合session依赖,引入后会自动将 session 存储到 redis 中--> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>2.6.3</version> </dependency>
注意:引入redis和spring-redis依赖版本需要接近
-
在application.xml里配置Redis和session
spring: #session session: #session失效时间 timeout: 86400 #默认是none,表示存储在单台服务器 store-type: redis #表示从redis中读写session(关键) #redis redis: port: 6379 host: xxx.xxx.xxx.xxx password: xxxxxx database: 0
关键:store-type: redis,只要配置了这个,那么代码中session就会存放到redis中而不是自己的内存中
测试
后端session存入redis
@Override public User userLogin(String userAccount, String userPassword, HttpServletRequest request) { //1.校验 //账号不能包含特殊字符 //2.加密 //查询账户是否存在 //用户不存在 //3.用户信息脱敏 //4.记录用户的登录态 request.getSession().setAttribute(USER_LOGIN_STATE,safetyUser); return safetyUser; }
向后端发送登录请求
验证redis中session是否存在
验证成功
转载至
https://blog.csdn.net/qq_43842093/article/details/120836732?ops_request_misc=&request_id=&biz_id=102&utm_term=Session%E5%85%B1%E4%BA%AB%E5%AE%9E%E7%8E%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-120836732.142^v56^js_top,201^v3^control_1&spm=1018.2226.3001.4187
https://blog.csdn.net/YXXXYX/article/details/125342292?ops_request_misc=&request_id=&biz_id=102&utm_term=Session%E5%85%B1%E4%BA%AB%E5%AE%9E%E7%8E%B0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-125342292.142^v56^js_top,201^v3^control_1&spm=1018.2226.3001.4187
标签:session,缓存,实现,Redis,redis,用户,Session,request,共享 From: https://www.cnblogs.com/galo/p/16796115.html