Spring Session响应式支持指南:WebSession

2023/05/13

1. 概述

在本文中,我们将学习如何将Spring Session与Spring WebFlux结合使用。具体来说,我们将学习如何使用Spring WebSession,它将Spring Session与Spring Boot 2的WebFlux结合在一起。

Spring Session被定义为“name-values对的简化Map”。会话跟踪对HTTP会话很重要的值,例如Users和Principals。因此,我们可以将Session管理与新的响应式WebFlux Mono和Flux对象一起使用。Spring Session还支持使用不同的应用程序容器(而不仅仅是Tomcat)。

有关Spring Session的更多信息,请查看另一篇文章。

2. Maven

现在,让我们设置和配置我们的应用程序。值得庆幸的是,配置我们的pom.xml非常容易。首先,我们需要使用Spring Boot 2.xx以及相关的Spring Session依赖项。通过Maven仓库添加最新版本:

然后,我们将它们添加到pom.xml中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
    <version>2.5.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.5.1</version>
</dependency>
<dependency> 
    <groupId>org.springframework.session</groupId> 
    <artifactId>spring-session-core</artifactId> 
    <version>2.5.1</version> 
</dependency>

这三个依赖项是内存中会话管理的最低要求。对于Redis,我们添加:

然后,将以下内容添加到pom.xml中:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.5.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
    <version>2.5.1</version>
 </dependency>

现在,让我们配置我们的类。

3. 内存中配置

要使用内存中配置,请添加配置类:

@Configuration
@EnableSpringWebSession
public class SessionConfig {

    @Bean
    public ReactiveSessionRepository reactiveSessionRepository() {
        return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
    }
}

它将(响应式)Repository与你的会话管理器相关联。将这些值存储到HashMap中。

重要的是,配置类必须包含@EnableSpringWebSession注解。

4. Redis配置

现在,让我们连接Redis。要使用Redis管理WebSessions,添加以下配置类:

@Configuration
@EnableRedisWebSession
public class RedisConfig {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }
}

请注意,配置类必须包含@EnableRedisWebSession注解。请记住,我们不能同时使用@EnableRedisWebSession和EnableSpringWebSession注解。

Docker是与Redis交互的最简单方法之一。安装Docker后,我们只需要输入三个命令即可。运行命令以启动Redis实例:

docker stop redis
docker rm redis
docker run -d --name redis -p 6379:6379 redis:4.0.5-alpine

接下来,让我们测试我们的应用程序。

5. 实践

现在,让我们向我们的应用程序添加一个响应式REST控制器:

@RestController
public class SessionController {

    @GetMapping("/websession/test")
    public Mono<CustomResponse> testWebSessionByParam(
          @RequestParam(value = "id") int id,
          @RequestParam(value = "note") String note,
          WebSession session) {

        session.getAttributes().put("id", id);
        session.getAttributes().put("note", note);

        CustomResponse r = new CustomResponse();
        r.setId((int) session.getAttributes().get("id"));
        r.setNote((String) session.getAttributes().get("note"));

        return Mono.just(r);
    }

    @GetMapping("/websession")
    public Mono<CustomResponse> getSession(WebSession session) {

        session.getAttributes().putIfAbsent("id", 0);
        session.getAttributes().putIfAbsent("note", "Howdy Cosmic Spheroid!");

        CustomResponse r = new CustomResponse();
        r.setId((int) session.getAttributes().get("id"));
        r.setNote((String) session.getAttributes().get("note"));

        return Mono.just(r);
    }
}

然后,我们可以通过向REST处理程序添加参数来使用WebSession。我们可以使用返回Map的getAttributes()方法获取或设置值。

让我们启动我们的Spring应用程序:

现在,可以在localhost:8080查看我们的应用程序,并将显示Spring登录页面。尝试默认登录凭证(-u admin -p password):

身份验证后,我们可以更改默认的WebSession值(0和“Howdy Cosmic Spheroid!”)。运行curl命令:

$ curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X GET http://localhost:8080/websession/test?id=222&e=helloworld

或访问URL http://localhost:8080/websession/test?id=222&note=helloworld。此后,从localhost:8080/websession返回的JSON将显示更新后的Session值:

该端点localhost:8080/websession返回当前WebSession属性id和note。

6. 总结

我们学习了如何将Spring WebSession添加到我们的WebFlux应用程序中。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章