对于最新的稳定版本,请使用 Spring Session 3.3.1

对于最新的稳定版本,请使用 Spring Session 3.3.1

本指南介绍如何在使用 REST 端点时使用 Spring Session 透明地利用 Redis 来支持 Web 应用程序。HttpSession

您可以在 rest 示例应用程序中找到完整的指南。
您可以在 rest 示例应用程序中找到完整的指南。

更新依赖项

在使用 Spring Session 之前,必须更新依赖项。 如果使用 Maven,则必须添加以下依赖项:

pom.xml
<dependencies>
	<!-- ... -->

	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
		<version>3.2.4</version>
		<type>pom</type>
	</dependency>
	<dependency>
		<groupId>io.lettuce</groupId>
		<artifactId>lettuce-core</artifactId>
		<version>6.2.7.RELEASE</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>6.1.9</version>
	</dependency>
</dependencies>

Spring 配置

添加所需的依赖项后,我们可以创建 Spring 配置。 Spring 配置负责创建一个 servlet 过滤器,该过滤器将实现替换为 Spring Session 支持的实现。 为此,请添加以下 Spring 配置:HttpSession

@Configuration
@EnableRedisHttpSession (1)
public class HttpSessionConfig {

	@Bean
	public LettuceConnectionFactory connectionFactory() {
		return new LettuceConnectionFactory(); (2)
	}

	@Bean
	public HttpSessionIdResolver httpSessionIdResolver() {
		return HeaderHttpSessionIdResolver.xAuthToken(); (3)
	}

}
1 注解创建一个名为 的 Spring bean,用于实现 。 过滤器负责替换 Spring Session 支持的实现。 在这种情况下,Spring Session 由 Redis 提供支持。@EnableRedisHttpSessionspringSessionRepositoryFilterFilterHttpSession
2 我们创建一个将 Spring Session 连接到 Redis 服务器。 我们将连接配置为连接到默认端口 (6379) 上的 localhost。 有关配置 Spring Data Redis 的更多信息,请参阅参考文档RedisConnectionFactory
3 我们自定义 Spring Session 的 HttpSession 集成,以使用 HTTP 标头而不是 cookie 来传达当前会话信息。
1 注解创建一个名为 的 Spring bean,用于实现 。 过滤器负责替换 Spring Session 支持的实现。 在这种情况下,Spring Session 由 Redis 提供支持。@EnableRedisHttpSessionspringSessionRepositoryFilterFilterHttpSession
2 我们创建一个将 Spring Session 连接到 Redis 服务器。 我们将连接配置为连接到默认端口 (6379) 上的 localhost。 有关配置 Spring Data Redis 的更多信息,请参阅参考文档RedisConnectionFactory
3 我们自定义 Spring Session 的 HttpSession 集成,以使用 HTTP 标头而不是 cookie 来传达当前会话信息。

Servlet 容器初始化

我们的 Spring Configuration 创建了一个名为 的 Spring Bean,用于实现 . Bean 负责用 Spring Session 支持的自定义实现替换 bean。springSessionRepositoryFilterFilterspringSessionRepositoryFilterHttpSession

为了让我们发挥它的魔力,Spring 需要加载我们的类。 我们在 Spring 中提供了配置,如下例所示:FilterConfigMvcInitializer

src/main/java/sample/mvc/MvcInitializer.java
@Override
protected Class<?>[] getRootConfigClasses() {
	return new Class[] { SecurityConfig.class, HttpSessionConfig.class };
}

最后,我们需要确保我们的 Servlet 容器(即 Tomcat)对每个请求都使用我们的容器。 幸运的是,Spring Session 提供了一个名为 Utility 类的实用程序类,使执行此操作变得容易。为此,请使用默认构造函数扩展类,如以下示例所示:springSessionRepositoryFilterAbstractHttpSessionApplicationInitializer

src/main/java/sample/Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer {

}
我们类 () 的名称无关紧要。重要的是我们扩展.InitializerAbstractHttpSessionApplicationInitializer
我们类 () 的名称无关紧要。重要的是我们扩展.InitializerAbstractHttpSessionApplicationInitializer

rest示例应用程序

本节介绍如何使用示例应用程序。rest

运行示例应用程序rest

可以通过获取源代码并调用以下命令来运行示例:

若要使示例正常工作,必须在 localhost 上安装 Redis 2.8+ 并使用默认端口 (6379) 运行它。 或者,您可以将指向 Redis 服务器更新。 另一种选择是使用 Docker 在 localhost 上运行 Redis。 有关详细说明,请参阅 Docker Redis 存储库RedisConnectionFactory
$ ./gradlew :spring-session-sample-javaconfig-rest:tomcatRun

您现在应该能够在 localhost:8080/ 访问该应用程序

探索示例应用程序rest

您现在可以尝试使用该应用程序。为此,请使用您喜欢的 REST 客户端请求 localhost:8080/

	$ curl -v http://localhost:8080/

请注意,系统会提示您进行基本身份验证。为用户名和密码提供以下信息:

  • 用户名 user

  • 密码 密码

然后运行以下命令:

$ curl -v http://localhost:8080/ -u user:password

在输出中,应注意以下内容:

HTTP/1.1 200 OK
...
X-Auth-Token: 0dc1f6e1-c7f1-41ac-8ce2-32b6b3e57aa3

{"username":"user"}

具体来说,您应该注意有关我们回复的以下几点:

  • HTTP 状态现在为 200。

  • 我们有一个标头,名称为 和 包含新的会话 ID。X-Auth-Token

  • 将显示当前用户名。

我们现在可以使用 发出另一个请求,而无需再次提供用户名和密码。例如,以下命令输出用户名,如前所述:X-Auth-Token

	$ curl -v http://localhost:8080/ -H "X-Auth-Token: 0dc1f6e1-c7f1-41ac-8ce2-32b6b3e57aa3"

唯一的区别是响应标头中没有提供会话 ID,因为我们正在重用现有会话。

如果我们使会话无效,则响应中将显示一个空值。例如,以下命令使我们的会话无效:X-Auth-Token

	$ curl -v http://localhost:8080/logout -H "X-Auth-Token: 0dc1f6e1-c7f1-41ac-8ce2-32b6b3e57aa3"

您可以在输出中看到 提供了一个空,指示上一个会话无效:X-Auth-TokenString

HTTP/1.1 204 No Content
...
X-Auth-Token:

它是如何工作的?

Spring Security 与 中的标准交互。HttpSessionSecurityContextPersistenceFilter

Spring Security 现在不再使用 Tomcat 的 ,而是将这些值保存在 Redis 中。 Spring Session 会在浏览器中创建一个名为 header。 该标头包含会话的 ID。HttpSessionX-Auth-Token

如果您愿意,可以很容易地看到会话是在 Redis 中创建的。 为此,请使用以下命令创建会话:

$ curl -v http://localhost:8080/ -u user:password

在输出中,应注意以下内容:

HTTP/1.1 200 OK
...
X-Auth-Token: 7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

{"username":"user"}

现在,您可以使用 redis-cli 删除会话。 例如,在基于 Linux 的系统上,可以键入:

	$ redis-cli keys '*' | xargs redis-cli del
Redis 文档包含安装 redis-cli 的说明。

或者,您也可以删除显式密钥。 为此,请在您的终端中输入以下内容,并确保替换为您的 cookie 值:7e8383a4-082c-4ffe-a4bc-c40fd3363c5eSESSION

	$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

现在,我们可以使用 对我们删除的会话发出另一个请求,并观察提示我们进行身份验证的我们。例如,以下内容返回 HTTP 401:X-Auth-Token

	$ curl -v http://localhost:8080/ -H "X-Auth-Token: 0dc1f6e1-c7f1-41ac-8ce2-32b6b3e57aa3"
若要使示例正常工作,必须在 localhost 上安装 Redis 2.8+ 并使用默认端口 (6379) 运行它。 或者,您可以将指向 Redis 服务器更新。 另一种选择是使用 Docker 在 localhost 上运行 Redis。 有关详细说明,请参阅 Docker Redis 存储库RedisConnectionFactory
Redis 文档包含安装 redis-cli 的说明。