1.引入依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<!-- 引入 redis 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>>
在上面的示例中,除了引入Redis组件外,还需要引入spring-session-data-redis依赖。通过此组件实现Session信息的管理。
2.添加session配置类
package com.yangjunbo.JPADemo.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30)
public class SessionConfig {
}
上面的示例配置了Session的缓存时间。maxInactiveIntervalInSeconds用于设置Session的失效时间,使用Redis共享Session之后,原Spring Boot的server.session.timeout属性不再有效。经过上面的配置后,Session调用就会自动去Redis上存取。另外,想要达到Session共享的目的,只需要在其他系统上进行同样的配置即可。
3.验证测试
创建测试类
package com.yangjunbo.JPADemo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
import java.util.UUID;
@RestController
@RequestMapping()
public class Controller {
@RequestMapping("/uid")
String uid(HttpSession session) {
UUID uid = (UUID) session.getAttribute("uid");
if (uid == null) {
uid = UUID.randomUUID();
}
session.setAttribute("uid", uid);
return session.getId();
}
}
然后,启动项目,运行一个程序实例,启动端口号为8080,在浏览器中输入地址:http://localhost:8080/uid,页面返回会话的sessionId。
我们可以登录Redis客户端,查看Session是否已经保存到Redis,输入“keys ‘sessions’”查看所有的Session信息,如图所示。
一般mac上redis的安装目录 /usr/local/opt/redis/bin/redis-server /usr/local/etc/redis.conf
从上面的输出可以看到,sessionId是5c7b3e44-1695-4d2d-9955-a8ec80309eaa,与页面返回的sessionId一致。说明Redis中缓存的SessionId和实际使用的Session一致,Session已经在Redis中进行了有效的管理。
最后,模拟分布式系统再启动一个程序实例,启动端口号为8001,在浏览器中输入http://localhost:8001/uid,页面返回会话的SessionId如图所示。
从输出结果可以看到,程序实例1和程序实例2获取的是同一个Session,这说明两个程序实现了Session共享。
参考书籍 《springboot从入门到实战-章为忠著》