Spring Session - HttpSession (Quick Start)

本指南描述了如何使用 Spring 会话以透明的方式利用 Redis 来支持基于 XML 配置的 Web 应用程序的 HttpSession

您可以在 httpsession-xml sample application 中找到完整指南。

Updating Dependencies

在使用 Spring 会话之前,您必须更新依赖。如果您使用 Maven,您必须添加以下依赖:

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

	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
		<version>{spring-session-version}</version>
		<type>pom</type>
	</dependency>
	<dependency>
		<groupId>io.lettuce</groupId>
		<artifactId>lettuce-core</artifactId>
		<version>{lettuce-core-version}</version>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>{spring-core-version}</version>
	</dependency>
</dependencies>

Spring XML Configuration

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

src/main/webapp/WEB-INF/spring/session.xml
Unresolved include directive in modules/ROOT/pages/guides/xml-redis.adoc - include::example$spring-session-samples/spring-session-sample-xml-redis/src/main/webapp/WEB-INF/spring/session.xml[]
1 使用 <context:annotation-config/>RedisHttpSessionConfiguration 的组合,因为 Spring Session 尚未提供 XML 命名空间支持(请参阅 gh-104)。这将创建一个 Spring Bean,其名称为 springSessionRepositoryFilter,用于实现 Filter。该筛选器负责替换 HttpSession 实现,以便由 Spring Session 支持。在这种情况中,Spring Session 由 Redis 支持。
2 我们创建一个 RedisConnectionFactory,将 Spring 会话连接到 Redis 服务器。我们配置连接以在默认端口 (6379) 上连接到 localhost。有关配置 Spring 数据 Redis 的更多信息,请参阅 {docs-url}/spring-data/data-redis/docs/{spring-data-redis-version}/reference/html/[参考文档]。

XML Servlet Container Initialization

我们的 Spring Configuration 创建了一个名为 springSessionRepositoryFilter 的 Spring Bean,它实现了 FilterspringSessionRepositoryFilter Bean 负责使用由 Spring Session 支持的自定义实现来替换 HttpSession

为了让我们的 Filter 发挥作用,我们需要指示 Spring 加载我们的 session.xml 配置。我们可以通过以下配置来实现:

src/main/webapp/WEB-INF/web.xml
Unresolved include directive in modules/ROOT/pages/guides/xml-redis.adoc - include::example$spring-session-samples/spring-session-sample-xml-redis/src/main/webapp/WEB-INF/web.xml[]
Unresolved include directive in modules/ROOT/pages/guides/xml-redis.adoc - include::example$spring-session-samples/spring-session-sample-xml-redis/src/main/webapp/WEB-INF/web.xml[]

{docs-url}/spring/docs/{spring-core-version}/spring-framework-reference/core.html#context-create[ContextLoaderListener] 读入 contextConfigLocation,并拾取到我们的 session.xml 配置。

最后,我们需要确保我们的 Servlet 容器(即 Tomcat)针对每个请求使用我们的 springSessionRepositoryFilter。以下代码段为我们执行最后一步:

src/main/webapp/WEB-INF/web.xml
Unresolved include directive in modules/ROOT/pages/guides/xml-redis.adoc - include::example$spring-session-samples/spring-session-sample-xml-redis/src/main/webapp/WEB-INF/web.xml[]

{docs-url}/spring-framework/docs/{spring-core-version}/javadoc-api/org/springframework/web/filter/DelegatingFilterProxy.html[DelegatingFilterProxy] 按名称查找一个 Bean springSessionRepositoryFilter,并将其转换为 Filter。对于调用 DelegatingFilterProxy`的每个请求,都调用 `springSessionRepositoryFilter

httpsession-xml Sample Application

本节介绍如何使用 httpsession-xml 示例应用程序。

Running the httpsession-xml Sample Application

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

要让示例发挥作用,你必须在 localhost 上 install Redis 2.8+ 并使用默认端口 (6379) 运行它。或者,你可以更新 RedisConnectionFactory 以指向 Redis 服务器。另一个选项是使用 Docker 在 localhost 上运行 Redis。有关详细说明,请参见 Docker Redis repository

$ ./gradlew :spring-session-sample-xml-redis:tomcatRun

您现在应该能够访问 [role="bare"][role="bare"]http://localhost:8080/ 中的应用程序。

Exploring the httpsession-xml Sample Application

现在,您可以尝试使用该应用程序了。使用以下信息填写表单:

  • Attribute Name: username

  • Attribute Value: rob

然后,请点击 Set Attribute 按钮。您现在应该可以看到表中显示的值了。

How Does It Work?

我们与 HttpSession 中显示的标准 SessionServlet 进行交互,这在下表中有所说明:

src/main/java/sample/SessionServlet.java
Unresolved include directive in modules/ROOT/pages/guides/xml-redis.adoc - include::example$spring-session-samples/spring-session-sample-xml-redis/src/main/java/sample/SessionServlet.java[]

我们不使用 Tomcat 的 HttpSession,而是将值保存在 Redis 中。Spring Session 在浏览器中创建一个名为 SESSION 的 cookie。该 cookie 包含会话 ID。您可以查看 cookie(使用 ChromeFirefox)。

您可以使用 redis-cli 删除该会话。例如,在基于 Linux 的系统中,您可以键入以下内容:

	$ redis-cli keys '*' | xargs redis-cli del

Redis 文档包含有关 installing redis-cli 的说明。

或者,您也可以删除显式键。为此,将以下内容输入到您的终端中,并确保使用 SESSION cookie 的值替换 7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

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

现在,您可以访问 [role="bare"][role="bare"]http://localhost:8080/ 中的应用程序并看到我们添加的属性不再显示。