11-SpringSecurity:Session 共享
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
配置文件
server:
port: 8000
spring:
redis:
host: 10.16.1.110
port: 6379
pool.max-idle: 8
pool.min-idle: 0
pool.max-active: 8
pool.max-wait: -1
password:
timeout: 1000
资源接口
创建资源接口: 登录之后默认跳转 /
,展示当前服务的端口号。
@RestController
public class SessionController {
@Value("${server.port}")
Integer port;
@GetMapping(value = "/")
public String greeting() {
return String.valueOf(port);
}
}
[](()实验 0:伪分布式集群 Session 共享
开启两个服务:
一个运行在 8000 端口:http://localhost:8000
一个运行在 9000 端口:http://localhost:9000
Note:在 Idea 中,可通过以下配置可同时运行一个服务的多个实例。
实验步骤:
在浏览器中先访问
http://localhost:8000
,这时要求登录,输入用户名:user,密码在控制台生成;登录成功后显示:8000
;然后继续在当前浏览器新开一个 Tab,访问
http://localhost:9000
,不出意外,会直接显示(无需再次登录):9000
;这样,便通过一个依赖
spring-session-data-red **《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】** is
实现了Session
共享(就不贴图了);
Note:
由于仍然采用的传统的
Cookie-Session
模式,所以上述实验必须在同一浏览器下进行,在请求时,浏览器会自动带上Cookie
(其中存了 SessionID);实际生产中,通常通过
Nginx
进行反向代理,仅对外提供一个域名或接口地址,实现集群的负载均衡;
[](()实验 1:再次验证 Session 共享
在 Controller
中新增两个接口:一个写入键值对,一个读取键值,接口如下:
@RestController
public class SessionController {
@Value("${server.port}")
Integer port;
@GetMapping(value = "/")
public String greeting() {
return String.valueOf(port);
}
@GetMapping(value = "/session/set")
public String setSession(HttpSession session) {
session.setAttribute("key", "value");
return port + ": Session updated.";
}
@GetMapping(value = "/session/get")
public String getSession(HttpSession session) {
Object value = session.getAttribute("key");
return port + ":" + (String) value;
}
}
实验步骤:
在浏览器中先访问
http://localhost:8000/session/set
,这时显示:8000: Session updated.
;然后继续在当前浏览器新开一个 Tab,访问
http://localhost:9000/session/get
,不出意外,会显示:9000:value
;这样,实现了自定义键值对的
Session
共享;
评论