Spring Session - HttpSession (Quick Start)

此指南将介绍如何使用 Spring Session 透明地利用关系数据库来使用 Java 配置来为 Web 应用程序的 HttpSession 提供支持。

您可以在httpsession-jdbc sample application中找到已完成指南。

Updating Dependencies

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

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

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

Spring Java Configuration

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

Unresolved include directive in modules/ROOT/pages/guides/java-jdbc.adoc - include::example$spring-session-samples/spring-session-sample-javaconfig-jdbc/src/main/java/sample/Config.java[]
1 @EnableJdbcHttpSession 注释会创建一个 Spring Bean,其名称为 springSessionRepositoryFilter。该 bean 会实现 Filter。该筛选器负责替换 HttpSession 实现,以便由 Spring Session 支持。在这种情况中,Spring Session 由关系型数据库支持。
2 创建一个 dataSource,将它连接到一个嵌入式 H2 数据库的 Spring Session。配置 H2 数据库,以便使用 Spring Session 中包含的 SQL 脚本创建数据库表。
3 创建一个 transactionManager,用于管理之前配置的 dataSource 的事务。

有关如何配置数据访问相关问题的其他信息,请参阅 {docs-url}/spring/docs/{spring-core-version}/reference/html/data-access.html[Spring Framework Reference Documentation]。

Java Servlet Container Initialization

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

为了让我们的 Filter 发挥其魔力,Spring 需要加载我们的 Config 类。最后,我们需要确保我们的 Servlet 容器(即 Tomcat)针对每个请求使用我们的 springSessionRepositoryFilter。幸运的是,Spring Session 提供了一个名为 AbstractHttpSessionApplicationInitializer 的实用程序类,可以轻松地完成这两步。以下示例显示了如何执行此操作:

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

我们的类(Initializer)的名称无关紧要。重要的是我们扩展 AbstractHttpSessionApplicationInitializer

1 第一步是扩展`AbstractHttpSessionApplicationInitializer`。这样便可确保将名为`springSessionRepositoryFilter`的 Spring bean 与我们的 Servlet 容器注册于每个请求之中。
2 AbstractHttpSessionApplicationInitializer 还提供一种机制,以确保 Spring 载入我们的 Config

Multiple DataSources

Spring Session 提供了 @SpringSessionDataSource 限定符,它允许你在 JdbcIndexedSessionRepository 中明确声明应该注入哪个 DataSource bean。这在应用程序上下文中存在多个 DataSource bean 的情况下特别有用。

以下示例演示了如何执行此操作:

Config.java
@EnableJdbcHttpSession
public class Config {

	@Bean
	@SpringSessionDataSource (1)
	public EmbeddedDatabase firstDataSource() {
		return new EmbeddedDatabaseBuilder()
				.setType(EmbeddedDatabaseType.H2).addScript("org/springframework/session/jdbc/schema-h2.sql").build();
	}

	@Bean
	public HikariDataSource secondDataSource() {
		// ...
	}
}
1 此限定符声明 firstDataSource 应由 Spring 会话使用。

httpsession-jdbc Sample Application

本节介绍如何处理 httpsession-jdbc Sample Application。

Running the httpsession-jdbc Sample Application

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

$ ./gradlew :spring-session-sample-javaconfig-jdbc:tomcatRun

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

Exploring the httpsession-jdbc 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/java-jdbc.adoc - include::example$spring-session-samples/spring-session-sample-javaconfig-jdbc/src/main/java/sample/SessionServlet.java[]

不使用 Tomcat 的 HttpSession,我们在 H2 数据库中永久保存这些值。Spring Session 会在你的浏览器中创建一个名为 SESSION 的 cookie。该 cookie 包含你会话的 ID。你可以使用 ChromeFirefox 查看 cookie。

如果你想的话,可以使用位于 [role="bare"][role="bare"]http://localhost:8080/h2-console/ 的 H2 web 控制台来移除会话(为 JDBC URL 使用 jdbc:h2:mem:testdb)。

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