文章目录
一,Spring Session 简介
Spring Session 是 Spring Framework 的一部分,它提供了一个抽象层来管理分布式环境中的 HTTP Session。
Spring Session 的主要目的是使 Session 管理更加灵活和可扩展,特别是在分布式环境中。它允许将 Session 数据存储在多种后端存储系统中,如 Redis、Memcached、数据库等,从而避免了单点故障和横向扩展的问题。
Spring Session 的核心特性包括:
- 可插拔的存储层:可以很容易地切换 Session 的存储方式,如从内存切换到 Redis。
- 无状态服务:使得服务实例可以在集群中自由伸缩,而不必担心 Session 数据的分布问题。
- 简化配置:提供了简单的配置选项,使得开发者可以快速启动并运行。
二,使用步骤
1. 添加依赖
首先,你需要在你的项目中添加 Spring Session 相关的依赖。如果你使用的是 Maven,可以在 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
这里以 Redis 作为session的存储。
2. 配置 Spring Session
在认证服务的配置文件中增加如下配置,指定session的存储方式是redis。
spring.session.store-type=redis
接下来,你需要配置 Spring Session 以指定 Session 数据的存储方式。如果你使用的是 Java 配置,可以在你的配置类中添加以下配置:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800, redisNamespace = "spring:session")
public class HttpSessionConfig {
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
// 自定义 Cookie 的名称、路径等
serializer.setCookieName("SESSION");
serializer.setDomainNamePattern(".*\\.yourdomain\\.com");
return serializer;
}
}
这里使用了 @EnableRedisHttpSession
注解来启用基于 Redis 的 Session 存储。你还可以通过配置类自定义 Session 的超时时间 (maxInactiveIntervalInSeconds
) 和 Redis 命名空间 (redisNamespace
)。
3. 配置 Redis
因为auth认证模块中已经配置了redis,所以无需配置。
spring.redis.host=192.168.56.10
4. 启用SpringSession
在启动类上添加注解@EnableRedisHttpSession
。
5. 应用 Spring Session
一旦配置完成,Spring Session 就会自动接管 Session 的管理和存储。你不需要在控制器或其他地方显式地创建或操作 Session,Spring Session 会自动处理这些细节。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
@RestController
public class MyController {
@GetMapping("/session")
public String getSession(HttpSession session) {
session.setAttribute("name", "John Doe");
return "Hello, " + session.getAttribute("name");
}
}
HttpSession
会在后台自动与 Spring Session 集成,可以像往常一样使用 HttpSession
API。
6,测试
重新微博登录,查看redis,发现多了spring session相关的key。
查看auth认证服务浏览器控制台,发现cookie
存储的已经不是名称为JSESSIONID
的cookie
。
这些都说明Spring Session已经整合成功。
7,product模块配置spring session
前面是在auth
模块配置了spring session
,将session
保存在了redis
中。
首页是属于product
模块的,相当于product
模块要从redis
中取出session
,所以也必须配置spring session
。
做如下三件事即可:
-
引入spring session的依赖
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>
-
配置文件指定存储中间件是redis
spring.session.store-type=redis
-
启动类增加注解启用Spring Session
在启动类上添加注解@EnableRedisHttpSession
。
注意,这里使用session是比较隐蔽的方式,在index.html
模板中,有如下Thymleaf的表达式。
<a th:if="${session.loginUser != null}" >欢迎, [[${session.loginUser.nickname}]]</a>
session.loginUser.nickname
,Thymleaf在编译模板时就会使用SpringSession的API,到redis获取session数据。