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.3.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.1.14</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 | @EnableJdbcHttpSession 註解建立一個名為 springSessionRepositoryFilter 的 Spring Bean。該 Bean 實作 Filter 。此篩選器負責取代 HttpSession 實作,使其由 Spring Session 支援。在此例中,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
限定詞,讓您可以明確宣告應該在 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 | 此限定詞宣告 Spring Session 應使用 firstDataSource。 |
httpsession-jdbc
範例應用程式
本節說明如何使用 httpsession-jdbc
範例應用程式。
執行 httpsession-jdbc
範例應用程式
您可以透過取得 原始碼 並叫用下列命令來執行範例
$ ./gradlew :spring-session-sample-javaconfig-jdbc:tomcatRun
您現在應該可以透過 localhost:8080/ 存取應用程式
探索 httpsession-jdbc
範例應用程式
現在您可以嘗試使用應用程式。若要執行此操作,請填寫表單並輸入下列資訊
-
屬性名稱: username
-
屬性值: rob
現在按一下 設定屬性 按鈕。您現在應該會在表格中看到顯示的值。
運作方式為何?
我們在下列清單中顯示的 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 包含您的 Session ID。您可以檢視 Cookie (使用 Chrome 或 Firefox)。
如果您願意,可以使用 H2 Web 主控台移除 Session,網址為:localhost:8080/h2-console/ (JDBC URL 請使用 jdbc:h2:mem:testdb
)。
現在您可以造訪 localhost:8080/ 應用程式,並看到我們新增的屬性不再顯示。