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 文件:
在这段配置中:
-
upstream 表示配置上游服务器
-
javaboy.org 表示服务器集群的名字,这个可以随意取名字
-
upstream 里边配置的是一个个的单独服务
-
weight 表示服务的权重,意味者将有多少比例的请求从 Nginx 上转发到该服务上
-
location 中的 proxy_pass 表示请求转发的地址,
/
表示拦截到所有的请求,转发转发到刚刚配置好的服务集群中 -
proxy_redirect 表示设置当发生重定向请求时,nginx 自动修正响应头数据(默认是 Tomcat 返回重定向,此时重定向的地址是 Tomcat 的地址,我们需要将之修改使之成为 Nginx 的地址)。
配置完成后,将本地的 Spring Boot 打包好的 jar 上传到 Linux ,然后在 Linux 上分别启动两个 Spring Boot 实例:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
4671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />
读者福利
分享一份自己整理好的Java面试手册,还有一些面试题pdf
不要停下自己学习的脚步
[外链图片转存中…(img-sAoB2zeN-1712073705840)]
[外链图片转存中…(img-MOiTVR7q-1712073705840)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!