在单体项目中,我们将用户信息存在 session 中,那么在该 session 过期之前,我们都可以从 session 中获取到用户信息,通过登录拦截,进行操作
但是分布式部署的时候,我们请求的服务器可能不是同一台服务器,那么我们就必须要面对 session 共享的问题,下面介绍的是在 SpringBoot 实现 session 共享的方式
一、创建项目创建 SpringBoot 项目,选择 Maven 依赖
文章插图
文章插图
最终 pom.xml 文件如下:
<!-- redis的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- web的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- session共享的依赖 --><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>
二、配置 Redis我们需要借助 redis 实现 session 共享,所以我们需要在配置文件中配置 redis 的信息server:port: 8080spring:redis:host: 127.0.0.1port: 6379database: 0password:
我们配置了该项目的端口,以及 redis 的连接信息三、写接口
package com.zyxx.session.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMApping;import org.springframework.web.bind.annotation.RestController;import JAVAx.servlet.http.HttpSession;@RestControllerpublic class DemoController {/*** 获取项目端口*/@Value("${server.port}")private String port;/*** 将信息存放在session中*/@GetMapping("set")public String set(HttpSession session) {session.setAttribute("user", "hello world~~~");return port;}/*** 从session中获取信息*/@GetMapping("get")public String get(HttpSession session) {return session.getAttribute("user") + " : " + port;}}
我们写了一个 set,一个 get 方法,将信息存放在 session 中,从 session 中取出信息四、打包测试
文章插图
启动项目,分别启动在两个端口:
java -jar .session-0.0.1-SNAPSHOT.jar --server.port=8080java -jar .session-0.0.1-SNAPSHOT.jar --server.port=8081
分别启动在 8080,8081端口访问:http://localhost:8080/set
文章插图
我们从 8080 端口,将信息保存在 session 中
我们访问:http://localhost:8081/get
文章插图
我们在 8081 端口的项目中从 session 中取出了内容:hello world~~~
由此证明,我们的 session 共享已经成功
五、分布式部署下面我们借助 Nginx 代理转发访问这两个项目
1、配置转发nginx 配置文件如下:
文章插图
主要配置内容:
upstream helloworld{ server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=2;}
这里配置转发到 8080,8081 端口,并配置了权重location / { proxy_pass http://helloworld;#roothtml;#indexindex.html index.htm;}
拦截本地的所有请求,默认端口为 802、启动 nginx
nginx -s reload
3、访问测试我们先删除 redis 里面刚刚测试保存的信息文章插图
然后我们访问:
http://localhost/set
文章插图
这里我们可以看出,由 8080 端口的服务器完成了 set 请求,多次访问,nginx 将会根据什么配置的权重参数分配服务器来完成操作
下面我们访问:
http://localhost/get
文章插图
可以看出,由 8081 端口的服务器完成了 get 请求,并成功取到了存在 session 中的数据,实现了 session 共享
六、总结1、以前我们在 SSM 架构的项目中实现 session 共享,需要配置三个地方 ,一个是 web.xml 配置代理过滤器,然后在 Spring 容器中配置 Redis,最后再配置 Spring Session,相比 SpringBoot,稍有复杂
推荐阅读
- JavaScript 中如何判断变量是否为数字
- 狗狗的眼神纯真 小狗的眼睛如同
- 高分学长教你如何学好高一生物
- 春季如何养肝护肝 5款药膳粥护好小心肝
- 5款“女人如花”食疗法
- 如何正确的选购一辆电动车
- ecco女鞋价格如何
- 汽车变速箱该如何使用与保养
- 饼茶的制作工序,饼茶是如何压制而成的
- 电脑系统如何一键还原,电脑系统一键还原怎么操作?