Spring Session - HttpSession(快速入门)
本指南介绍如何使用 Spring Session 透明地利用关系数据库作为 Web 应用程序 HttpSession
的后端,通过 Java 配置实现。
您可以在 httpsession-jdbc 示例应用 中找到完整的指南。 |
更新依赖
在使用 Spring Session 之前,您必须更新您的依赖。如果您使用 Maven,则必须添加以下依赖
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
<version>3.4.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.2.5</version>
</dependency>
</dependencies>
Spring Java 配置
添加所需的依赖后,我们可以创建 Spring 配置。Spring 配置负责创建一个 Servlet Filter,该 Filter 用 Spring Session 支持的实现替换 HttpSession
实现。为此,请添加以下 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)
}
}
1 | @EnableJdbcHttpSession 注解会创建一个名为 springSessionRepositoryFilter 的 Spring Bean。该 Bean 实现了 Filter 。此 Filter 负责用由 Spring Session 支持的实现替换 HttpSession 。在本例中,Spring Session 由关系数据库支持。 |
2 | 我们创建一个 dataSource ,它将 Spring Session 连接到 H2 数据库的嵌入式实例。我们配置 H2 数据库使用 Spring Session 中包含的 SQL 脚本创建数据库表。 |
3 | 我们创建一个 transactionManager ,用于管理先前配置的 dataSource 的事务。 |
有关如何配置数据访问相关事项的更多信息,请参阅 Spring Framework 参考文档。
Java Servlet 容器初始化
我们的 Spring 配置 创建了一个名为 springSessionRepositoryFilter
的 Spring Bean,它实现了 Filter
。springSessionRepositoryFilter
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)
}
}
我们类的名称 (Initializer) 不重要。重要的是我们扩展了 AbstractHttpSessionApplicationInitializer 。 |
1 | 第一步是扩展 AbstractHttpSessionApplicationInitializer 。这样做确保了名为 springSessionRepositoryFilter 的 Spring Bean 被注册到我们的 Servlet 容器中,用于处理每个请求。 |
2 | AbstractHttpSessionApplicationInitializer 还提供了一种机制,用于确保 Spring 加载我们的 Config 。 |
多个 DataSource
Spring Session 提供了 @SpringSessionDataSource
限定符,允许您明确声明哪个 DataSource
Bean 应该被注入到 JdbcIndexedSessionRepository
中。这在应用程序上下文中存在多个 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() {
// ...
}
}
1 | 此限定符声明 firstDataSource 将被 Spring Session 使用。 |
httpsession-jdbc
示例应用
本节介绍如何使用 httpsession-jdbc
示例应用。
运行 httpsession-jdbc
示例应用
您可以通过获取源代码并执行以下命令来运行示例
$ ./gradlew :spring-session-sample-javaconfig-jdbc:tomcatRun
您现在应该能够访问应用程序,地址是 localhost:8080/
探索 httpsession-jdbc
示例应用
现在您可以尝试使用该应用程序。为此,填写以下信息的表单
-
属性名称: username
-
属性值: rob
现在点击 Set Attribute 按钮。您应该会看到这些值显示在表格中。
它是如何工作的?
我们在 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;
}
我们没有使用 Tomcat 的 HttpSession
,而是将值持久化到 H2 数据库中。Spring Session 会在您的浏览器中创建一个名为 SESSION
的 cookie。该 cookie 包含您会话的 ID。您可以查看 cookies(使用 Chrome 或 Firefox)。
如果您愿意,可以使用 H2 Web 控制台删除会话,该控制台可在以下地址访问:localhost:8080/h2-console/(JDBC URL 使用 jdbc:h2:mem:testdb
)。
现在您可以访问应用程序,地址是 localhost:8080/,并会发现我们添加的属性不再显示。