A Guide to Spring Session Reactive Support: WebSession – Spring Session Reactive支持指南 WebSession

最后修改: 2018年 10月 21日

中文/混合/英文(键盘快捷键:t)

1. Introduction

1.介绍

In this article, we’ll learn how to combine Spring Session with Spring WebFlux. Specifically, we’ll learn how to use Spring WebSession which unites Spring Session with Spring Boot 2’s WebFlux.

在这篇文章中,我们将学习如何将Spring Session与Spring WebFlux相结合。具体而言,我们将学习如何使用Spring WebSession,它将Spring Session与Spring Boot 2的WebFlux结合起来。

A Spring Session is defined as “a simplified Map of name-value pairs”. Sessions track values that are important to an HTTP session like Users and Principals. Thus, we can use Session management along with the new reactive WebFlux Mono and Flux objectsSpring Session also supports using different application-containers (rather than only Tomcat).

Spring的Session被定义为 “一个简化的Map的名-值对”。Sessions跟踪对HTTP会话很重要的值,如UsersPrincipals。因此,我们可以将Session管理与新的反应式WebFluxMonoFluxobjects一起使用。Spring Session还支持使用不同的应用程序容器(而不仅仅是Tomcat)。

For a more about Spring Session, check out another great article here on Baeldung.

关于Spring会议的更多信息,请查看这里的另一篇精彩文章Baeldung

2. Maven Setup

2.Maven的设置

Now, let’s get our app set up and configured. Thankfully, configuring our pom.xml is pretty easy to do. First, we need to use Spring Boot 2.x.x along with the relevant Spring Session dependencies. Add the newest version through Maven Repository:

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

Then, we add them to pom.xml:

然后,我们把它们添加到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>

Those three dependencies are the minimum requirements for in-memory Session management.  For Redis, use:

这三个依赖性是内存中会话管理的最低要求。 对于Redis,使用。

Then, add the following to the pom.xml:

然后,在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>

Now, let’s configure our classes.

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

3. In-Memory Configuration

3.内存中的配置

To use in-memory configuration, add the config class:

要使用内存中的配置,请添加config类。

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

That associates a (reactive) repository with your session manager. It’ll store those values into a HashMap.

这就将一个(反应式)存储库与你的会话管理器联系起来。它将把这些值存入一个HashMap

Importantly, the configuration class must include the @EnableSpringWebSession annotation.

重要的是,配置类必须包括@EnableSpringWebSessionannotation.

4. Redis Configuration

4.Redis配置

Now, let’s hook up Redis. To use Redis to manage WebSessions, add the configuration class:

现在,让我们挂上Redis。为了使用Redis来管理WebSessions,添加配置类。

@Configuration
@EnableRedisWebSession
public class RedisConfig {
 
    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory();
    }
}

Note, that the configuration class must include the @EnableRedisWebSession annotationRemember, we can’t use the@EnableRedisWebSession and EnableSpringWebSession annotations together without causing an exception.

请注意,配置类必须包括@EnableRedisWebSession注解记住,我们不能同时使用@EnableRedisWebSessionEnableSpringWebSession注解而不引起异常。

Docker is one of the easiest ways to interact with Redis. After installing Docker, we only need to enter three commands to do so. Run the command to bring up a Redis instance:

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

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

Next, let’s test our app.

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

5. In Practice

5.在实践中

Now, let’s add a reactive REST controller to our app:

现在,让我们为我们的应用程序添加一个反应式REST控制器。

@GetMapping("/websession")
public Mono<String> getSession(WebSession session) {
    session.getAttributes().putIfAbsent("note", "Howdy Cosmic Spheroid!");
    return Mono.just((String) session.getAttributes().get("note"));
}

Then, we can use WebSession by adding a parameter to our REST handlers.  We can get or set values using the .getAttributes() method which returns a Map.

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

Let’s spin up our Spring app:

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

websession one
Now, our app can be viewed at localhost:8080 and will present the Spring login page. Try the default login credentials (-u admin -p password):

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

websession two

After authenticating, we can change the default WebSession values (0  and “Howdy Cosmic Spheroid!”). Run curl command:

认证后,我们可以改变默认的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&note=helloworld

or visit the URL http://localhost:8080/websession/test?id=222&note=helloworld. Thereafter, the  JSON returned from localhost:8080/websession will display updated Session values:

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

websession three

That endpoint, localhost:8080/websession, returns current WebSession attributes id and note.

该端点localhost:8080/websession,返回当前WebSession属性idnote。

6. Conclusion

6.结论

We’ve learned how to add Spring WebSession to our WebFlux applications. For more information, check out the great official documentation.

我们已经学会了如何将Spring WebSession添加到我们的WebFlux应用程序中。欲了解更多信息,请查看伟大的官方文档。

As always, the code samples used in this article are available on GitHub.

一如既往,本文中使用的代码样本可在GitHub上获得。