跳到主要内容

Spring Session - HttpSession(快速开始)

QWen Max 中英对照 JDBC Spring Session - HttpSession (Quick Start)

本指南描述了如何使用 Spring Session 通过 Java 配置透明地利用关系型数据库来支持 Web 应用程序的 HttpSession

备注

你可以在 httpsession-jdbc 示例应用程序 中找到完整的指南。

Index

更新依赖项

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

<dependencies>
<!-- ... -->

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
<version>3.4.2</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.2.3</version>
</dependency>
</dependencies>
xml

Spring Java 配置

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

@Configuration(proxyBeanMethods = false)
@EnableJdbcHttpSession 1
public class Config {

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

@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource); 3
}

}
java
  • @EnableJdbcHttpSession 注解创建了一个名为 springSessionRepositoryFilter 的 Spring Bean。该 Bean 实现了 Filter 接口。过滤器负责将 HttpSession 实现替换为由 Spring Session 支持的实现。在这种情况下,Spring Session 由关系数据库支持。

  • 我们创建了一个 dataSource,它将 Spring Session 连接到 H2 数据库的嵌入式实例。我们配置 H2 数据库使用 Spring Session 中包含的 SQL 脚本来创建数据库表。

  • 我们创建了一个 transactionManager,用于管理之前配置的 dataSource 的事务。

有关如何配置与数据访问相关的设置的更多信息,请参见 Spring 框架参考文档

Java Servlet 容器初始化

我们的 Spring 配置 创建了一个名为 springSessionRepositoryFilter 的 Spring bean,它实现了 FilterspringSessionRepositoryFilter bean 负责将 HttpSession 替换为由 Spring Session 支持的自定义实现。

为了让我们的 Filter 发挥作用,Spring 需要加载我们的 Config 类。最后,我们需要确保我们的 Servlet 容器(即 Tomcat)对每个请求都使用我们的 springSessionRepositoryFilter。幸运的是,Spring Session 提供了一个名为 AbstractHttpSessionApplicationInitializer 的工具类,使得这两个步骤变得简单。下面的示例展示了如何做到这一点:

public class Initializer extends AbstractHttpSessionApplicationInitializer { 1

public Initializer() {
super(Config.class); 2
}

}
java
备注

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

  • 第一步是扩展 AbstractHttpSessionApplicationInitializer。这样做可以确保名为 springSessionRepositoryFilter 的 Spring bean 对每个请求都在我们的 Servlet 容器中注册。

  • AbstractHttpSessionApplicationInitializer 还提供了一种机制,以确保 Spring 加载我们的 Config

多个数据源

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

以下示例展示了如何实现这一点:

@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() {
// ...
}
}
java
  • 这个限定符声明 firstDataSource 将被 Spring Session 使用。

httpsession-jdbc 示例应用程序

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

运行 httpsession-jdbc 示例应用程序

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

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

你现在应该能够访问 localhost:8080/ 上的应用程序了。

探索 httpsession-jdbc 示例应用程序

现在你可以尝试使用该应用程序。为此,请用以下信息填写表单:

  • 属性名称: username

  • 属性值: rob

现在点击 设置属性 按钮。你应该会在表格中看到显示的值。

它是如何工作的?

我们在下面列出的 SessionServlet 中与标准的 HttpSession 进行交互:

@WebServlet("/session")
public class SessionServlet extends HttpServlet {

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String attributeName = req.getParameter("attributeName");
String attributeValue = req.getParameter("attributeValue");
req.getSession().setAttribute(attributeName, attributeValue);
resp.sendRedirect(req.getContextPath() + "/");
}

private static final long serialVersionUID = 2878267318695777395L;

}
java

我们不使用 Tomcat 的 HttpSession,而是将值持久化在 H2 数据库中。Spring Session 会在你的浏览器中创建一个名为 SESSION 的 cookie。该 cookie 包含你的会话 ID。你可以查看 cookie(使用 ChromeFirefox)。

如果你愿意,你可以通过访问 localhost:8080/h2-console/ 使用 H2 Web 控制台来移除会话(JDBC URL 使用 jdbc:h2:mem:testdb)。

现在你可以访问 localhost:8080/,并看到我们添加的属性不再显示。