Springboot +spring security,如何解决Session共享问题

news/2024/11/13 4:33:51/

一.简介

前一篇文章的所有的会话都是基于单机,如果服务部署在集群中,就会出现session失效的问题,为什么在集群环境下会出现session失效呢?

二.集群环境下session失效的原因

当用户第一次访问项目时,是机器1处理了登录请求,然后将session信息保存在机器1的内存中,登陆之后,用户再次访问,由于负载均衡,用户被路由到了机器2,但是机器2没有保存用户登陆的session信息,所以会引导用户到登陆页面,进行登陆操作,这就是session失效。接下来给大家演示下。

二.创建项目

要搭建两个服务。

如何创建一个SpringSecurity项目,前面文章已经有说明了,这里就不重复写了。

创建一个项目,开启security,配置一个controller。代码如下:

@RestController
public class IndexController {@Value("${server.port}")public Integer port;@RequestMapping("/")public String index(Authentication authentication){return "hello"+authentication.getName()+",i`m port:"+port;}
}

分别打成两个jar包,启动端口分别为8080和8081,截图如下:
在这里插入图片描述
在这里插入图片描述

三.安装nginx

我这边安装的有可视化界面的nginx WebUi,docker安装。指令如下:

docker run -itd --restart=always --name=nginxWebUI -v /home/nginxWebUI:/home/nginxWebUI -e BOOT_OPTIONS="--server.port=8083" --privileged=true --net=host  cym1102/nginxwebui:latest /bin/bash

访问nginx 页面

浏览器输入 http://ip:8083,截图如下:
在这里插入图片描述

配置负载均衡

使用IP Hash策略,权重分别为10和1,截图如下:
在这里插入图片描述

配置反向代理,截图如下:
在这里插入图片描述

启用配置,截图如下:

在这里插入图片描述
访问服务地址

http://ip/login 输入用户名和密码:user和123456,截图如下:
在这里插入图片描述
在这里插入图片描述
登陆成功,当前是8080机器响应,成功登陆到8080机器 我们刚才配置的权重是8080=10,8081=1,我们可以验证我们刷新页面10次,是否会跳转到8081机器。截图如下:
在这里插入图片描述
刷到第11次之后,我们跳转到了登录页面,因为8081机器没有保存登录用户的session信息,所以需要登录,这也就是session在集群下,为什么会失效的原因,那么看下有哪些解决方案?

四.session 失效解决方案

4.1主要三种

  1. session复制
    多个服务之间相互复制session信息,用户登录任何一机器,生成的session信息都会在其他服务之间保存一份
    其实tomcat通过IP组播的方式支持了这种,但是不建议使用,因为随着机器越多,复制的就越多,效率和并发都会相应的降低
  2. Session 粘滞
    即会话保持,始终保证用户在一台机器上,也就不会出现session丢失的问题
    但是无法解决并发问题,因为每台机器都维护自己的session,无法进行统一管理
  3. session 共享
    将所有机器产生的session会话放在统一存储空间中,任何机器都能访问
    一般可以借助redis或memcached 都可以实现,这节内容主要使用redis完成session共享

4.2利用spring-session+redis 实现session 共享

引入spring-session相关依赖:

org.springframework.boot:spring-boot-starter-data-redis
org.springframework.session:spring-session-data-redis

配置securityConfig
代码如下:

 @Autowiredprivate FindByIndexNameSessionRepository sessionRepository;@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests().anyRequest().authenticated().and().formLogin().permitAll().and().sessionManagement().maximumSessions(-1).sessionRegistry(sessionRegistry());http.csrf().disable();return http.build();}@Beanpublic SpringSessionBackedSessionRegistry sessionRegistry(){return new SpringSessionBackedSessionRegistry(sessionRepository);}

配置redis 连接信息,配置信息如下:

server.port=8081
spring.security.user.password=123456
spring.redis.port=6379
spring.redis.host=192.168.64.2

重新打8080,8081两个包
在这里插入图片描述

在这里插入图片描述

将负载均衡的权重给移除

在这里插入图片描述

访问验证

http://ip/login 输入用户名和密码:user和123456,截图如下:
在这里插入图片描述
点击登录,跳转到8081
在这里插入图片描述
刷新页面,跳转到8080
在这里插入图片描述
再刷新,跳转到8081
在这里插入图片描述

session 共享已经实现,我们再看下redis中存储的数据。截图如下:
在这里插入图片描述


http://www.ppmy.cn/news/82128.html

相关文章

ApiKit 接口调用、自动化测试工具

作为一位后端开发,我们平时经常需要维护API文档、对API接口进行调试、有时候还得Mock数据。Postman虽然作为接口调试工具非常好用,但是对于维护API文档这类工作却不太合适。今天给大家推荐一款功能更强大的工具ApiKit,足以满足我们对API的各种…

深入理解计算机系统第七章知识点总结

文章目录 详解ELF文件-> main.o前十六个字节的含义推测elf的大小查看节头部表推断每个section在elf中的具体位置查看.text的内容查看.data的内容关于.bss查看.rodata的内容关于其他的节表示的信息 详解符号表符号编译器如何解析多重定义的全局符号静态库与静态链接构造和使用…

开源网安受邀参加2023澳门万讯论坛,引领软件安全领域国产化替代浪潮

近日,2023万讯论坛在澳门成功举办。本次论坛由万讯电脑科技主办,旨在为澳门引入更多具有市场竞争力且自主研发的国内科技产品。开源网安作为拥有软件安全领域全链条产品的厂商,受邀参加本次论坛并分享软件安全领域国产化替代方案。 随着全球通…

【Java EE】Spring Cloud Gateway

Spring Cloud Gateway 添加Spring Cloud Gateway术语表工作流程网关的作用路由负载均衡统一处理跨域发布控制流量染色统一接口保护统一业务处理统一鉴权访问控制统一日志统一文档 网关的分类实现网关开启日志断言过滤器 参考文档 https://springdoc.cn/spring-cloud-gateway/ …

vscode开发小程序项目并在微信开发者工具运行

需求:vscode开发uniapp之后在微信开发者工具运行,更改的时候微信开发者也同步更改 1.创建小程序命令 这里的uniapp-vue是项目名称,不能大写 vue create -p dcloudio/uni-preset-vue uniapp-vue 2.选择uni-app模版 有几种模版选择&#x…

交叉验证之KFold和StratifiedKFold的使用(附案例实战)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

GPT应用-使用中文操作数据库

GPT应用-使用中文操作数据库 本次尝试使用langchain来操作数据库; 环境配置 下面是数据库相关的表,使用Mysql5.7 数据库,数据库名students 下面是相关表的介绍 学生表,有名字、分数、和老师的备注 学生父母表,其中有学生的名…

使用Socks5代理和HTTP协议的爬虫技术

网络爬虫是一种广泛应用的技术,用于从互联网上获取和分析数据。本文将介绍如何结合Socks5代理和HTTP协议来构建高效、稳定的爬虫系统。通过使用Socks5代理,我们可以在爬取数据时保护隐私并维持匿名性,同时利用HTTP协议实现数据的抓取和处理。…