Spring Session - HttpSession (Quick Start)
此指南介绍如何使用 Spring Session 透明地利用关系数据库作为基于 XML 的配置 Web 应用程序的 HttpSession
。
您可以在httpsession-jdbc-xml sample application中找到已完成指南。 |
Updating Dependencies
在你使用 Spring Session 之前,你必须更新你的依赖项。如果你使用的是 Maven,你必须添加以下依赖项:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
<version>{spring-session-version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>{spring-core-version}</version>
</dependency>
</dependencies>
Spring XML Configuration
在添加必需的依赖项后,我们可以创建 Spring 配置。Spring 配置负责创建一个 servlet 筛选器,它使用 Spring Session 支持的实现替换 HttpSession
实现。以下清单展示了如何添加以下 Spring 配置:
Unresolved include directive in modules/ROOT/pages/guides/xml-jdbc.adoc - include::example$spring-session-samples/spring-session-sample-xml-jdbc/src/main/webapp/WEB-INF/spring/session.xml[]
1 | 使用 <context:annotation-config/> 和 JdbcHttpSessionConfiguration 的组合,因为 Spring Session 尚未提供 XML 命名空间支持(请参阅 gh-104)。这将创建一个 Spring bean,其名称为 springSessionRepositoryFilter 。该 bean 会实现 Filter 。该筛选器负责替换 HttpSession 实现,以便由 Spring Session 支持。在这种情况中,Spring Session 由关系型数据库支持。 |
2 | 创建一个 dataSource ,将它连接到一个嵌入式 H2 数据库的 Spring Session。配置 H2 数据库,以便使用 Spring Session 中包含的 SQL 脚本创建数据库表。 |
3 | 创建一个 transactionManager ,用于管理之前配置的 dataSource 的事务。 |
有关如何配置数据访问相关问题的其他信息,请参阅 {docs-url}/spring/docs/{spring-core-version}/spring-framework-reference/data-access.html[Spring Framework Reference Documentation]。
XML Servlet Container Initialization
我们的 Spring Configuration 创建了一个名为 springSessionRepositoryFilter
的 Spring bean,它实现了 Filter
。springSessionRepositoryFilter
bean 负责使用 Spring Session 支持的自定义实现替换 HttpSession
。
为了让 Filter
发挥其作用,我们需要指示 Spring 加载我们的 session.xml
配置。我们使用以下配置执行此操作:
Unresolved include directive in modules/ROOT/pages/guides/xml-jdbc.adoc - include::example$spring-session-samples/spring-session-sample-xml-jdbc/src/main/webapp/WEB-INF/web.xml[]
Unresolved include directive in modules/ROOT/pages/guides/xml-jdbc.adoc - include::example$spring-session-samples/spring-session-sample-xml-jdbc/src/main/webapp/WEB-INF/web.xml[]
{docs-url}/spring/docs/{spring-core-version}/spring-framework-reference/core.html#context-create[ContextLoaderListener
] 读入 contextConfigLocation
,并拾取到我们的 session.xml 配置。
最后,我们需要确保我们的 Servlet 容器(即 Tomcat)针对每个请求使用我们的 springSessionRepositoryFilter
。以下代码段为我们执行最后一步:
Unresolved include directive in modules/ROOT/pages/guides/xml-jdbc.adoc - include::example$spring-session-samples/spring-session-sample-xml-jdbc/src/main/webapp/WEB-INF/web.xml[]
{docs-url}/spring-framework/docs/{spring-core-version}/javadoc-api/org/springframework/web/filter/DelegatingFilterProxy.html[DelegatingFilterProxy
] 按名称查找一个 Bean springSessionRepositoryFilter
,并将其转换为 Filter
。对于调用 DelegatingFilterProxy`的每个请求,都调用 `springSessionRepositoryFilter
。
httpsession-jdbc-xml
Sample Application
本节描述了如何使用 httpsession-jdbc-xml
示例应用程序。
Running the httpsession-jdbc-xml
Sample Application
您可以获取 源代码 并调用以下命令运行示例:
$ ./gradlew :spring-session-sample-xml-jdbc:tomcatRun
您现在应该能够访问 [role="bare"][role="bare"]http://localhost:8080/ 中的应用程序。
Exploring the httpsession-jdbc-xml
Sample Application
现在你可以尝试使用此应用程序。为此,请填写以下信息的表单:
-
Attribute Name: username
-
Attribute Value: rob
然后,请点击 Set Attribute 按钮。您现在应该可以看到表中显示的值了。
How Does It Work?
我们在以下 SessionServlet
中与标准 HttpSession
进行交互:
Unresolved include directive in modules/ROOT/pages/guides/xml-jdbc.adoc - include::example$spring-session-samples/spring-session-sample-xml-jdbc/src/main/java/sample/SessionServlet.java[]
不使用 Tomcat 的 HttpSession
,我们在 H2 数据库中永久保存这些值。Spring Session 会在你的浏览器中创建一个名为 SESSION
的 cookie。该 cookie 包含你会话的 ID。你可以使用 Chrome 或 Firefox 查看 cookie。
你可以使用位于 [role="bare"][role="bare"]http://localhost:8080/h2-console/ 的 H2 web 控制台来移除会话(为 JDBC URL 使用 jdbc:h2:mem:testdb
)。
现在你可以访问位于 [role="bare"][role="bare"]http://localhost:8080/ 的应用,并观察我们添加的属性不再显示。