Spring Session - HttpSession(快速入门)
本指南描述如何在基于 XML 的配置中使用 Spring Session 透明地利用关系型数据库来支撑 Web 应用程序的 HttpSession。
你可以在 httpsession-jdbc-xml 示例应用程序 中找到完整的指南。
更新依赖
在使用 Spring Session 之前,你必须更新依赖。如果你使用 Maven,你必须添加以下依赖:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
<version>4.1.1</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>7.0.9</version>
</dependency>
</dependencies>
Spring XML 配置
添加所需依赖后,我们可以创建 Spring 配置。Spring 配置负责创建一个 servlet 过滤器,用由 Spring Session 支撑的实现替换 HttpSession 实现。以下清单展示了如何添加以下 Spring 配置:
// <1>
<context:annotation-config/>
<bean class="org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration"/>
// <2>
<jdbc:embedded-database id="dataSource" database-name="testdb" type="H2">
<jdbc:script location="classpath:org/springframework/session/jdbc/schema-h2.sql"/>
</jdbc:embedded-database>
// <3>
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource"/>
</bean>
我们使用
<context:annotation-config/>和JdbcHttpSessionConfiguration的组合,因为 Spring Session 尚未提供 XML 命名空间支持(参见 gh-104)。这会创建一个名为springSessionRepositoryFilter的 Spring bean。该 bean 实现Filter。该过滤器负责将HttpSession实现替换为由 Spring Session 支撑。在本例中,Spring Session 由关系型数据库支撑。我们创建一个
dataSource,将 Spring Session 连接到嵌入式 H2 数据库实例。我们配置 H2 数据库使用 Spring Session 中包含的 SQL 脚本来创建数据库表。我们创建一个
transactionManager,为先前配置的dataSource管理事务。
有关如何配置数据访问相关事项的更多信息,请参阅 Spring Framework 参考文档。
XML Servlet 容器初始化
我们的 Spring 配置 创建了一个名为 springSessionRepositoryFilter、实现 Filter 的 Spring bean。springSessionRepositoryFilter bean 负责将 HttpSession 替换为由 Spring Session 支撑的自定义实现。
为了让我们的 Filter 发挥作用,我们需要指示 Spring 加载我们的 session.xml 配置。我们通过以下配置来做到这一点:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/session.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
ContextLoaderListener 读取 contextConfigLocation 并加载我们的 session.xml 配置。
最后,我们需要确保 Servlet 容器(即 Tomcat)对每个请求都使用我们的 springSessionRepositoryFilter。以下代码片段为我们执行了这最后一步:
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
DelegatingFilterProxy 按名称 springSessionRepositoryFilter 查找一个 bean,并将其转换为 Filter。每当调用 DelegatingFilterProxy 时,就会调用 springSessionRepositoryFilter。
httpsession-jdbc-xml 示例应用程序
本节描述如何使用 httpsession-jdbc-xml 示例应用程序。
运行 httpsession-jdbc-xml 示例应用程序
你可以通过获取源代码并运行以下命令来启动示例:
$ ./gradlew :spring-session-sample-xml-jdbc:tomcatRun
现在你应该可以通过 localhost:8080/ 访问该应用程序了。
探索 httpsession-jdbc-xml 示例应用程序
现在你可以尝试使用该应用程序。为此,在表单中填写以下信息:
- 属性名称: username
- 属性值: rob
现在点击 Set Attribute 按钮。你现在应该能在表格中看到显示的值。
它是如何工作的?
我们在以下 SessionServlet 中与标准 HttpSession 交互:
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;
}
你可以通过以下地址提供的 H2 Web 控制台移除会话:localhost:8080/h2-console/(JDBC URL 使用 jdbc:h2:mem:testdb)。
现在你可以访问 localhost:8080/ 上的应用程序,并观察到我们添加的属性不再显示。