Spring Security 如何处理 Session 共享

本文介绍了如何在SpringBoot应用中配置Redis以存储和同步会话信息,使用SpringSession简化操作,并解决在SpringBoot+Vue项目中session并发管理的问题。还提到了如何通过Nginx实现服务实例自动切换以及提供的Java学习资源链接。
摘要由CSDN通过智能技术生成

2.2 配置

spring.redis.password=123

spring.redis.port=6379

spring.redis.host=127.0.0.1

spring.security.user.name=javaboy

spring.security.user.password=123

server.port=8080

配置一下 Redis 的基本信息;Spring Security 为了简化,我就将用户名密码直接配置在 application.properties 中了,最后再配置一下项目端口号。

2.3 使用

配置完成后 ,就可以使用 Spring Session 了,其实就是使用普通的 HttpSession ,其他的 Session 同步到 Redis 等操作,框架已经自动帮你完成了:

@RestController

public class HelloController {

@Value(“${server.port}”)

Integer port;

@GetMapping(“/set”)

public String set(HttpSession session) {

session.setAttribute(“user”, “javaboy”);

return String.valueOf(port);

}

@GetMapping(“/get”)

public String get(HttpSession session) {

return session.getAttribute(“user”) + “:” + port;

}

}

考虑到一会 Spring Boot 将以集群的方式启动 ,为了获取每一个请求到底是哪一个 Spring  Boot 提供的服务,需要在每次请求时返回当前服务的端口号,因此这里我注入了 server.port 。

接下来 ,项目打包:

图片

打包之后,启动项目的两个实例:

java -jar session-4-0.0.1-SNAPSHOT.jar --server.port=8080

java -jar session-4-0.0.1-SNAPSHOT.jar --server.port=8081

然后先访问 localhost:8080/set 向 8080 这个服务的 Session 中保存一个变量,第一次访问时会自动跳转到登录页面,输入用户名密码进行登录即可。访问成功后,数据就已经自动同步到 Redis  中 了 :

图片

然后,再调用 localhost:8081/get 接口,就可以获取到 8080 服务的 session 中的数据:

图片

此时关于 session 共享的配置就已经全部完成了,session 共享的效果我们已经看到了。

2.4 Security 配置

Session 共享已经实现了,但是我们发现新的问题,在Spring Boot + Vue 前后端分离项目,如何踢掉已登录用户?一文中我们配置的 session 并发管理失效了。

也就是说,如果我添加了如下配置:

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests().anyRequest()

.sessionManagement()

.maximumSessions(1)

.maxSessionsPreventsLogin(true);

}

现在这个配置不起作用,用户依然可以在多个浏览器上同时登录。

这是怎么回事呢?

首先建议大家回忆一下Spring Boot + Vue 前后端分离项目,如何踢掉已登录用户?一文。

在该文中,我们提到,会话注册表的维护默认是由 SessionRegistryImpl 来维护的,而 SessionRegistryImpl 的维护就是基于内存的维护。现在我们虽然启用了 Spring Session+Redis 做 Session 共享,但是 SessionRegistryImpl 依然是基于内存来维护的,所以我们要修改 SessionRegistryImpl 的实现逻辑。

修改方式也很简单,实际上 Spring Session 为我们提供了对应的实现类 SpringSessionBackedSessionRegistry,具体配置如下:

@Configuration

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired

FindByIndexNameSessionRepository sessionRepository;

@Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests().anyRequest()

.sessionManagement()

.maximumSessions(1)

.maxSessionsPreventsLogin(true)

.sessionRegistry(sessionRegistry());

}

@Bean

SpringSessionBackedSessionRegistry sessionRegistry() {

return new SpringSessionBackedSessionRegistry(sessionRepository);

}

}

我们在这里只需要提供一个 SpringSessionBackedSessionRegistry 的实例,并且将其配置到 sessionManagement 中去即可。以后,session 并发数据的维护将由 SpringSessionBackedSessionRegistry 来完成,而不是 SessionRegistryImpl,如此,我们关于 session 并发的配置就生效了,在集群环境下,用户也只可以在一台设备上登录。

为了让我们的案例看起更完美一些,接下来我们来引入 Nginx ,实现服务实例自动切换。

3.引入 Nginx


很简单,进入  Nginx 的安装目录的 conf 目录下(默认是在 /usr/local/nginx/conf),编辑 nginx.conf 文件:

图片

在这段配置中:

  1. upstream 表示配置上游服务器

  2. javaboy.org 表示服务器集群的名字,这个可以随意取名字

  3. upstream 里边配置的是一个个的单独服务

  4. weight 表示服务的权重,意味者将有多少比例的请求从 Nginx 上转发到该服务上

  5. location 中的 proxy_pass 表示请求转发的地址,/ 表示拦截到所有的请求,转发转发到刚刚配置好的服务集群中

  6. proxy_redirect 表示设置当发生重定向请求时,nginx 自动修正响应头数据(默认是 Tomcat 返回重定向,此时重定向的地址是 Tomcat 的地址,我们需要将之修改使之成为 Nginx 的地址)。

配置完成后,将本地的 Spring Boot 打包好的 jar 上传到 Linux ,然后在 Linux 上分别启动两个 Spring Boot 实例:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

不要停下自己学习的脚步

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
4671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

读者福利

分享一份自己整理好的Java面试手册,还有一些面试题pdf

不要停下自己学习的脚步

[外链图片转存中…(img-sAoB2zeN-1712073705840)]

[外链图片转存中…(img-MOiTVR7q-1712073705840)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值