Spring Session - HttpSession(快速开始)
本指南描述了如何使用 Spring Session 通过 Java 配置透明地利用关系型数据库来支持 Web 应用程序的 HttpSession
。
你可以在 httpsession-jdbc 示例应用程序 中找到完整的指南。
更新依赖项
在使用 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>
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
}
}
@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,它实现了 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
。
第一步是扩展
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() {
// ...
}
}
这个限定符声明
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;
}
如果你愿意,你可以通过访问 localhost:8080/h2-console/ 使用 H2 Web 控制台来移除会话(JDBC URL 使用 jdbc:h2:mem:testdb
)。
现在你可以访问 localhost:8080/,并看到我们添加的属性不再显示。