Spring Session - HttpSession (Quick Start)
本指南描述了如何使用 Spring Session 透明地利用 Redis 为 Web 应用程序的`HttpSession`提供支持,采用的是 Java 配置。
您可以在httpsession sample application中找到已完成指南。 |
Updating Dependencies
在你使用 Spring Session 之前,你必须更新你的依赖项。如果你使用的是 Maven,你必须添加以下依赖项:
<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>
由于我们使用的是 SNAPSHOT 版本,因此我们需要确保添加 Spring Snapshot Maven 存储库。在你的 pom.xml 中必须具有以下内容:
<repositories>
<!-- ... -->
<repository>
<id>spring-snapshot</id>
<url>https://repo.spring.io/libs-snapshot</url>
</repository>
</repositories>
Spring Java Configuration
在添加所需的依赖项后,我们可以创建我们的 Spring 配置。Spring 配置负责创建一个 Servlet 过滤器,该过滤器将 HttpSession
实现替换为由 Spring Session 支持的实现。为此,请添加以下 Spring 配置:
Unresolved include directive in modules/ROOT/pages/guides/java-redis.adoc - include::example$spring-session-samples/spring-session-sample-javaconfig-redis/src/main/java/sample/Config.java[]
1 | @EnableRedisHttpSession 注释会创建一个 Spring Bean,其名称为 springSessionRepositoryFilter`并会实现 `Filter 。该筛选器负责替换 HttpSession 实现,以便由 Spring Session 支持。在这种情况中,Spring Session 由 Redis 支持。 |
2 | 创建一个 RedisConnectionFactory ,将它连接到 Spring Session 和 Redis Server。我们配置连接以连接到默认端口(6379)上的 localhost。有关配置 Spring Data Redis 的更多信息,请参阅 {docs-url}/spring-data/data-redis/docs/{spring-data-redis-version}/reference/html/[参考文档]。 |
Java Servlet Container Initialization
我们的 Spring Configuration 创建了一个名为 springSessionRepositoryFilter
的 Spring Bean,它实现了 Filter
。springSessionRepositoryFilter
Bean 负责使用由 Spring Session 支持的自定义实现来替换 HttpSession
。
为了让我们的 Filter
发挥作用,Spring 需要加载我们的 Config
类。最后,我们需要确保我们的 Servlet 容器(即 Tomcat)对每个请求使用我们的 springSessionRepositoryFilter
。幸运的是,Spring Session 提供了一个名为 AbstractHttpSessionApplicationInitializer
的实用程序类,可以轻松完成这两个步骤。以下显示了一个示例:
Unresolved include directive in modules/ROOT/pages/guides/java-redis.adoc - include::example$spring-session-samples/spring-session-sample-javaconfig-redis/src/main/java/sample/Initializer.java[]
我们的类 (Initializer
) 的名称并不重要,重要的是我们必须延伸`AbstractHttpSessionApplicationInitializer`。
1 | 第一步是扩展 AbstractHttpSessionApplicationInitializer 。这样做可确保名为 springSessionRepositoryFilter 的 Spring Bean 会向我们的 Servlet 容器注册每个请求。 |
2 | AbstractHttpSessionApplicationInitializer 还提供一种机制,以确保 Spring 载入我们的 Config 。 |
httpsession Sample Application
Running the httpsession
Sample Application
您可以获取 源代码 并调用以下命令运行示例:
$ ./gradlew :spring-session-sample-javaconfig-redis:tomcatRun
要让示例发挥作用,你必须在 localhost 上 install Redis 2.8+ 并使用默认端口 (6379) 运行它。或者,你可以更新 |
您现在应该能够访问 [role="bare"][role="bare"]http://localhost:8080/ 中的应用程序。
Exploring the httpsession
Sample Application
现在,你可以尝试使用该应用程序。为此,请使用以下信息填写表单:
-
Attribute Name: username
-
Attribute Value: rob
然后,请点击 Set Attribute 按钮。您现在应该可以看到表中显示的值了。
How Does It Work?
我们与 HttpSession
中显示的标准 SessionServlet
进行交互,这在下表中有所说明:
Unresolved include directive in modules/ROOT/pages/guides/java-redis.adoc - include::example$spring-session-samples/spring-session-sample-javaconfig-redis/src/main/java/sample/SessionServlet.java[]
我们不使用 Tomcat 的 HttpSession
,而是将值保存在 Redis 中。Spring Session 在浏览器中创建一个名为 SESSION
的 cookie。该 cookie 包含会话 ID。您可以查看 cookie(使用 Chrome 或 Firefox)。
你可以使用 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/ 中的应用程序并看到我们添加的属性不再显示。