Spring Session - HttpSession(快速入門)
本指南介紹如何使用 Spring Session 透明地利用關係資料庫作為 Web 應用程式 HttpSession
的後端,透過 Java 配置實現。
您可以在 httpsession-jdbc 示例應用 中找到完整的指南。 |
更新依賴
在使用 Spring Session 之前,您必須更新您的依賴。如果您使用 Maven,則必須新增以下依賴
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
<version>3.4.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.2.5</version>
</dependency>
</dependencies>
Spring Java 配置
新增所需的依賴後,我們可以建立 Spring 配置。Spring 配置負責建立一個 Servlet Filter,該 Filter 用 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 | @EnableJdbcHttpSession 註解會建立一個名為 springSessionRepositoryFilter 的 Spring Bean。該 Bean 實現了 Filter 。此 Filter 負責用由 Spring Session 支援的實現替換 HttpSession 。在本例中,Spring Session 由關係資料庫支援。 |
2 | 我們建立一個 dataSource ,它將 Spring Session 連線到 H2 資料庫的嵌入式例項。我們配置 H2 資料庫使用 Spring Session 中包含的 SQL 指令碼建立資料庫表。 |
3 | 我們建立一個 transactionManager ,用於管理先前配置的 dataSource 的事務。 |
有關如何配置資料訪問相關事項的更多資訊,請參閱 Spring Framework 參考文件。
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 。 |
1 | 第一步是擴充套件 AbstractHttpSessionApplicationInitializer 。這樣做確保了名為 springSessionRepositoryFilter 的 Spring Bean 被註冊到我們的 Servlet 容器中,用於處理每個請求。 |
2 | AbstractHttpSessionApplicationInitializer 還提供了一種機制,用於確保 Spring 載入我們的 Config 。 |
多個 DataSource
Spring Session 提供了 @SpringSessionDataSource
限定符,允許您明確宣告哪個 DataSource
Bean 應該被注入到 JdbcIndexedSessionRepository
中。這在應用程式上下文中存在多個 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-jdbc
示例應用
現在您可以嘗試使用該應用程式。為此,填寫以下資訊的表單
-
屬性名稱: username
-
屬性值: rob
現在點選 Set Attribute 按鈕。您應該會看到這些值顯示在表格中。
它是如何工作的?
我們在 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;
}
我們沒有使用 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/,並會發現我們新增的屬性不再顯示。