✅P227_商城业务-认证服务-Spring Session整合

gong_yz大约 3 分钟谷粒商城

Spring Session官方文档

Spring Session 3.2.1open in new window

更新依赖项

在将 Spring Session 与 Redis 一起使用之前,必须确保具有正确的依赖项。我们假设您正在使用一个正在运行的 Spring Boot Web 应用程序。

<dependencies>
	<!-- ... -->

	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
	</dependency>
</dependencies>

Spring Boot 为 Spring Session 模块提供依赖管理,因此您无需显式声明依赖版本。

Spring启动配置

添加所需的依赖项后,我们可以创建 Spring Boot 配置。得益于一流的自动配置支持,设置由 Redis 支持的 Spring Session 就像向您的 中添加单个配置属性一样简单application.properties,如以下清单所示:

src/main/resources/application.properties

spring.session.store-type=redis #会话存储类型。

在底层,Spring Boot 应用的配置相当于手动添加@EnableRedisHttpSession注释。这将创建一个名为springSessionRepositoryFilterImplements的 Spring bean Filter。过滤器负责替换HttpSessionSpring Session 支持的实现。

可以使用应用程序进一步自定义application.properties,如以下清单所示:

src/main/resources/application.properties

server.servlet.session.timeout= # 会话超时。如果未指定持续时间后缀,则使用秒。
spring.session.redis.flush-mode=on_save #会话刷新模式。
spring.session.redis.namespace=spring:session # 用于存储会话的键的命名空间。

有关更多信息,请参阅Spring Boot 文档的Spring Session部分。open in new window

配置Redis连接

Spring Boot 自动创建一个RedisConnectionFactory将 Spring Session 连接到本地主机上端口 6379(默认端口)的 Redis 服务器。在生产环境中,您需要更新配置以指向 Redis 服务器。例如,您可以在 application.properties 中包含以下内容:

src/main/resources/application.properties

spring.data.redis.host=localhost # Redis 服务器主机。
spring.data.redis.password= # redis服务器的登录密码。
spring.data.redis.port=6379 # Redis 服务器端口。

有关更多信息,请参阅Spring Boot 文档的连接到 Redis部分。open in new window

Servlet容器初始化

我们的Spring Boot 配置open in new window创建了一个名为的 Spring bean,springSessionRepositoryFilter它实现了Filter.该springSessionRepositoryFilterbean 负责HttpSession用 Spring Session 支持的自定义实现替换。

为了让我们Filter发挥它的魔力,Spring 需要加载我们的Config类。最后,我们需要确保我们的 servlet 容器(即 Tomcat)springSessionRepositoryFilter对每个请求都使用我们的。幸运的是,Spring Boot 为我们处理了这两个步骤。


Spring Session整合

cfmall-auth-server服务整合Spring Session

导入依赖

cfmall-auth-server/pom.xml

<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

Spring启动配置

cfmall-auth-server/src/main/resources/application.properties

# 会话存储类型
spring.session.store-type=redis
# 会话超时。如果未指定持续时间后缀,则使用秒
server.servlet.session.timeout=30s
# 会话刷新模式
spring.session.redis.flush-mode=on_save
# 用于存储会话的键的命名空间
spring.session.redis.namespace=spring:session

Redis配置

cfmall-auth-server/src/main/resources/application.yml

spring:
  application:
    name: cfmall-auth-server
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  redis:
    host: 192.168.17.130
    port: 6379

Java配置

CfmallAuthServerApplication启动类上加@EnableRedisHttpSession注解,

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableRedisHttpSession
public class CfmallAuthServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(CfmallAuthServerApplication.class, args);
    }

}

测试

看是否将session存入redis中

出现问题:DefaultSerializer requires a Serializable payload but received an object of type [com.atguigu.gulimall.auth.vo.MemberRespVo]

原因: MemberResponseVo未实现序列化解接口

解决:public class MemberResponseVo implements Serializable {...}

再次测试发现redis中存储session数据,

**cfmall-product**服务同样按照上述操作进行Spring Session整合