|
此版本仍在开发中,尚未被认为是稳定的。请使用最新的稳定版本 Spring Session 4.0.2! |
Spring Session - HttpSession (快速入门)
此指南描述了如何使用 Spring Session 通过关系数据库透明地为基于 Java 配置的 Web 应用程序的 HttpSession 提供支持。
| 您可以在session-jdbc 样本应用中找到完成的指南。 |
更新依赖项
在使用Spring Session之前,您必须更新您的依赖项。 如果您使用Maven,请添加以下依赖项:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
<version>4.1.0-M1</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>7.0.4</version>
</dependency>
</dependencies>
Spring Java 配置
在添加了所需的依赖项后,我们可以创建我们的Spring配置。
Spring 配置负责创建一个servlet过滤器,该过滤器用基于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 | The @EnableJdbcHttpSession 注解创建一个名为 springSessionRepositoryFilter 的 Spring Bean。
该 Bean 实现了 Filter。
过滤器负责将 HttpSession 的实现替换为由 Spring Session 支持的实现。
在这个例子中,Spring Session 由关系数据库支持。 |
| 2 | 我们创建一个dataSource,将Spring Session连接到嵌入式的H2数据库实例。
我们通过使用Spring Session中包含的SQL脚本来配置H2数据库以创建数据库表。 |
| 3 | 我们创建一个transactionManager来管理之前配置好的dataSource的事务。 |
对于如何配置数据访问相关的设置的更多信息,请参阅 Spring 框架参考文档。
Java Servlet 容器初始化
我们的springSessionRepositoryFilter的Spring Bean,该Bean实现了Filter。
springSessionRepositoryFilter Bean负责用一个由Spring Session支持的自定义实现来替换HttpSession。
为了使我们的Filter发挥作用,Spring 需要加载我们的Config类。
最后,我们需要确保我们的Servlet容器(即Tomcat)为每个请求使用我们的springSessionRepositoryFilter。
幸运的是,Spring Session提供了一个名为AbstractHttpSessionApplicationInitializer的工具类来使这两步变得轻松。
以下示例展示了如何实现这一点:
public class Initializer extends AbstractHttpSessionApplicationInitializer { (1)
public Initializer() {
super(Config.class); (2)
}
}
我们的类名(初始化器)并不重要。
重要的是我们继承了AbstractHttpSessionApplicationInitializer。 |
| 1 | 第一步是扩展 AbstractHttpSessionApplicationInitializer。 这样做可以确保名为 springSessionRepositoryFilter 的 Spring bean 在每次请求时都注册到我们的 Servlet 容器中。 |
| 2 | 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() {
// ...
}
}
| 1 | 此限定符声明firstDataSource应由Spring Session使用。 |
httpsession-jdbc示例应用程序
此部分描述了如何使用httpsession-jdbc示例应用程序。
运行httpsession-jdbc示例应用程序
您可以运行示例程序,通过获取源代码并执行以下命令来实现:
$ ./gradlew :spring-session-sample-javaconfig-jdbc:tomcatRun
您应该能够通过以下地址访问应用:localhost:8080/
它是如何工作的?
我们与在以下列表中展示的标准 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/访问应用程序,并看到我们添加的属性不再显示。