最新稳定版请使用Spring Session 3.5.3spring-doc.cadn.net.cn

春季课程 - HttpSession(快速入门)

本指南介绍了如何使用 Spring Session 透明地利用关系数据库来支持网页应用HttpSession使用Java Configuration。spring-doc.cadn.net.cn

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

更新依赖关系

在使用春季会话之前,您必须更新依赖。 如果你使用 Maven,必须添加以下依赖关系:spring-doc.cadn.net.cn

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

	<dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-jdbc</artifactId>
		<version>3.3.7</version>
		<type>pom</type>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>6.1.16</version>
	</dependency>
</dependencies>

Spring Java 配置

添加所需的依赖后,我们可以创建 Spring 配置。Spring 配置负责创建一个 Servlet 过滤器,取代HttpSession实现时,Spring Session支持的实现。 为此,添加以下Spring配置:spring-doc.cadn.net.cn

@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. 豆子的实现Filter. 过滤器负责更换HttpSession实施将由Spring Session支持。 在这种情况下,Spring Session 是由关系型数据库支持的。
2 我们创建一个数据来源它将 Spring Session 连接到 H2 数据库的嵌入式实例。 我们通过 Spring Session 中包含的 SQL 脚本配置 H2 数据库来创建数据库表。
3 我们创建一个transactionManager它管理已配置的交易数据来源.

有关如何配置数据访问相关问题的更多信息,请参见Spring Framework参考文档spring-doc.cadn.net.cn

Java Servlet 容器初始化

我们的春季配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterBean负责替换HttpSession并采用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter要施展它的魔力,Spring需要加载我们的配置类。 最后,我们需要确保我们的Servlet容器(即Tomcat)使用我们的springSessionRepositoryFilter每一个请求。 幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer让这两个步骤都变得简单。 以下示例展示了如何实现:spring-doc.cadn.net.cn

src/main/java/sample/Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer { (1)

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

}
我们类的名称(初始化器)并不重要。 重要的是我们要延展AbstractHttpSessionApplicationInitializer.
1 第一步是延长AbstractHttpSessionApplicationInitializer. 这样做确保春季豆命名为springSessionRepositoryFilter在我们的Servlet容器中注册了所有请求。
2 AbstractHttpSessionApplicationInitializer还提供了确保Spring载荷的机制配置.

多数据源

Spring Session提供@SpringSessionDataSource限定符,允许你明确声明哪一个数据来源豆子应该注射进去JdbcIndexedSessionRepository. 这在多个场景中尤为有用数据来源在应用上下文中出现的豆子。spring-doc.cadn.net.cn

以下示例展示了如何实现:spring-doc.cadn.net.cn

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 Session 使用。

HTTPSenSession-JDBC示例应用

本节介绍了如何与HTTPSenSession-JDBC示例应用。spring-doc.cadn.net.cn

运行HTTPSenSession-JDBC示例应用

您可以通过获取源代码并调用以下命令来运行示例:spring-doc.cadn.net.cn

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

你现在应该可以在localhost:8080/访问该应用了spring-doc.cadn.net.cn

探索HTTPSenSession-JDBC示例应用

现在你可以试试用这个应用了。填写表格时需填写以下信息:spring-doc.cadn.net.cn

现在点击设置属性按钮。你现在应该能在表格中看到显示的数值。spring-doc.cadn.net.cn

它是如何运作的?

我们与标准互动HttpSessionSessionServlet如下列表所示:spring-doc.cadn.net.cn

src/main/java/sample/SessionServlet.java
@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 创建了一个名为会期在你的浏览器里。 这个Cookie里包含了你会话的ID。 你可以查看这些Cookie(使用ChromeFirefox)。spring-doc.cadn.net.cn

如果你愿意,可以通过 localhost:8080/h2-console/ 的 H2 网页控制台移除会话JDBC:H2:mem:testDB用于JDBC网址)。spring-doc.cadn.net.cn

现在你可以访问 localhost:8080/ 的应用程序,看到我们添加的属性已不再显示。spring-doc.cadn.net.cn