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

news2024/12/25 1:01:57

一.简介

前一篇文章的所有的会话都是基于单机,如果服务部署在集群中,就会出现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
代码如下:

 @Autowired
    private FindByIndexNameSessionRepository sessionRepository;
    @Bean
    public 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();
    }
    @Bean
    public 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.coloradmin.cn/o/567055.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes1.22.0 部署 metricis-service

概述 Install cfssl cat > proxy-client-csr.json<<EOF {"CN": "aggregator","hosts": [],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN",&quo…

SVD求解两组多维点之间的欧式变换矩阵,及halcon代码实现

之前研究了二维点的仿射变换&#xff0c;用解矩阵的方式求解了两组二维点之间的变换矩阵。 学习了下SVD&#xff0c;看到可以用SVD求解两组多维点之间的欧式变换矩阵&#xff0c;当然也是个最优化问题。 这里的变换只有平移和旋转&#xff0c;没有缩放。 一、先说结论&#…

【DNDC模型】农田生态、陆地生态系统的动态模拟模型

DNDC模型 DNDC模型是一个用于模拟和追踪农业生态系统中碳氮生物地球化学循环的过程模型&#xff0c;可以用来模拟农业生态系统碳氮排放、农作物产量、土壤固碳作用以及硝酸盐淋失等过程。 模型由两部分组成&#xff1a;第一部分包括土壤气候、植物生长和有机质分解等3个子模型…

整理6个超好用的在线编辑器!

随着 Web 开发对图像可扩展性、响应性、交互性和可编程性的需求增加&#xff0c;SVG 图形成为最适合 Web 开发的图像格式之一。它因文件小、可压缩性强并且无论如何放大或缩小&#xff0c;图像都不会失真而受到欢迎。然而&#xff0c;为了编辑 SVG 图像&#xff0c;需要使用 SV…

【共享内存】

1 共享内存示意图 共享内存区是最快的 IPC 形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到 内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 2 共享内存数据结构 struct shmid_ds {struct ipc_…

Mysql 学习(十 三)InnoDB的BufferPool

为什么要有缓存&#xff1f; 我们知道每次获取数据我们都需要从磁盘获取&#xff0c;磁盘的运行速度又慢的不行&#xff0c;对于这一个问题我们要怎么解决呢&#xff1f;我们把查询结果存储起来不就行了&#xff0c;因为当需要访问某个页的数据时&#xff0c;就会把完整的页的…

再见SpringSecurity,比Shiro更简单优雅的轻量级Sa-Token框架我粉了

1. 技术选型 最近在做登录、授权的功能&#xff0c;一开始考虑到的是spring boot spring security&#xff0c;但spring security太重&#xff0c;而我们是轻量级的项目&#xff0c;所以&#xff0c;spring security不适合我们。 而后考虑spring boot shiro&#xff0c;但s…

SSD202 Linux开发日志记录

一、挂载U盘 SDK默认自动加载USB存储模块&#xff0c;但没有自动挂载&#xff0c;插上U盘后识别sda mount /dev/sda /mnt/即可在/mnt查看U盘文件 二、make & make menuconfig提示失败 打开新终端后输入 declare -x ARCH"arm" declare -x CROSS_COMPILE"…

记一次php 导出word文档

导出试卷 先看效果 $paper Exam::where(id, $data[examid])->field(paper_id,title)->find();$bankIds PaperStorehouse::where(id, $paper[paper_id])->value(banks);$field type,rate,name,options,parsing,value,question_id,parsing_id;$bankInfo Banks::whe…

北邮22信通:二叉树显示路径的两种方法 递归函数保存现场返回现场的实例

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 一.讲解 要想实现二叉树的路径显示&#xff0c;我们要按照…

gitbook在centos上安装

1&#xff09;官网下载Node.js的Linux64位的二进制包:Download | Node.js 或者在线下载&#xff1a; wget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz ​​2)到指定目录​解压 cd /opt/gitbook tar -xJf node-v12.16.1-linux-x64.tar.xz mv node-…

记录--按钮级别权限怎么控制

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 最近的面试中有一个面试官问我按钮级别的权限怎么控制&#xff0c;我说直接v-if啊&#xff0c;他说不够好&#xff0c;我说我们项目中按钮级别的权限控制情况不多&#xff0c;所以v-if就够了&#xff…

wifiWG233移植

驱动的移植 交叉编译WIFI原厂固件驱动 根据网上资料&#xff0c;和官方文档编译成功。 修改Makefile 修改交叉编译环境 执行 make 编译成功&#xff0c;生成88x2bu.ko 加载原厂驱动 Insmod 88x2bu.ko 生成wlan0 Hostapd工具移植生成可连接热点AP 安装libnl库 使用命令tar …

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

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

如何清除电脑缓存?分享3个有效的方法!

案例&#xff1a;我发现我的电脑运行速度越来越慢&#xff0c;影响使用体验。朋友说可能是我没有及时清理电脑缓存文件所致&#xff0c;那如何清理缓存的文件&#xff1f; 【我想通过清理电脑缓存文件的方法&#xff0c;提高我电脑运行的速度&#xff0c;但是我不知道具体的操…

如何利用Citespace和vosviewer既快又好地写出高质量的论文及快速锁定热点和重点文献进行可视化分析?

基于Citespace和vosviewer文献计量学可视化SCI论文高效写作方法 CiteSpace是什么&#xff1f; 简单来说&#xff0c;它一款通过将国内外文献进行可视化分析来帮助你了解一门学科前世今生的软件。 面对成千上万篇的文献&#xff0c;怎样才能快速锁定自己最感兴趣的主题及科学…

取代 Docker Desktop?Podman Desktop 发布 GA 版本 1.0

Podman&#xff08;POD MANager&#xff09;是一个跨平台的容器管理工具&#xff0c;可用于管理容器、镜像、卷以及以容器组形式存在的 Pod。Podman 可以在 Linux 上直接运行容器&#xff0c;但在像 macOS 和 Windows 这样的平台&#xff0c;是通过虚拟机间接运行容器。 Podma…

「实在RPA·电商数字员工」契合电商数智转型需求

一、为什么说电商数智化转型很重要&#xff1f; 如今&#xff0c;电商发展速度惊人&#xff0c;并且已经取代了实体店购物的时代。在众多新型的消费方式下&#xff0c;各式的电商行业如何运作&#xff0c;并且在短时间内完成各项任务&#xff0c;提升人们的生活质量。人们生活…

django admin后台列表页、修改/详情页图片预览功能

目录 一、admin后台列表页的图片预览功能 二、admin后台修改/详情页图片预览功能 1&#xff0c;添加html前端代码 2、在admin.py文件中添加以下代码&#xff1a; 1.列表页图片问题&#xff1a;在admin列表页中&#xff0c;直接在list_display中填写图片字段时在列表页展示的…

YOLOv5从训练到移植

一、图像采集和标注 图像采集 覆盖所有的数据目标&#xff0c;不同场景&#xff08;视角、光照、可能的干扰&#xff09;、距离、运动、背景等&#xff0c;用深度和广度摄像头都行。 若兼顾效率和准确率&#xff0c;可以用迁移学习思路训练&#xff0c;则不同场景下采集的图…