Spring Session - HttpSession(快速入門)
本指南介紹如何使用 Spring Session 以透明方式利用 Redis 作為 Web 應用 HttpSession
的支援,使用 Java 配置。
你可以在 httpsession 示例應用 中找到完整的指南。 |
更新依賴
在使用 Spring Session 之前,必須更新依賴。如果你使用 Maven,需要新增以下依賴
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>3.4.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.3.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.2.5</version>
</dependency>
</dependencies>
由於我們使用的是 SNAPSHOT 版本,需要確保新增 Spring Snapshot Maven 倉庫。你需要在 pom.xml 中包含以下內容
<repositories>
<!-- ... -->
<repository>
<id>spring-snapshot</id>
<url>https://repo.spring.io/libs-snapshot</url>
</repository>
</repositories>
Spring Java 配置
新增所需的依賴後,我們可以建立 Spring 配置。Spring 配置負責建立一個 servlet 過濾器,該過濾器將 HttpSession
的實現替換為由 Spring Session 支援的實現。為此,請新增以下 Spring 配置
@Configuration(proxyBeanMethods = false)
@EnableRedisHttpSession (1)
public class Config {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory(); (2)
}
}
1 | @EnableRedisHttpSession 註解會建立一個名為 springSessionRepositoryFilter 的 Spring Bean,它實現了 Filter 介面。該過濾器負責將 HttpSession 實現替換為由 Spring Session 支援的實現。在此示例中,Spring Session 由 Redis 提供支援。 |
2 | 我們建立一個 RedisConnectionFactory ,用於將 Spring Session 連線到 Redis 伺服器。我們將連線配置為連線到 localhost 的預設埠 (6379)。有關配置 Spring Data Redis 的更多資訊,請參閱 參考文件。 |
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 。 |
httpsession 示例應用
執行 httpsession
示例應用
可以透過獲取 原始碼 並執行以下命令來執行示例
$ ./gradlew :spring-session-sample-javaconfig-redis:tomcatRun
要使示例工作,必須在 localhost 上安裝 Redis 2.8+ 並以預設埠 (6379) 執行。或者,你可以更新 RedisConnectionFactory 以指向另一個 Redis 伺服器。另一種選擇是使用 Docker 在 localhost 上執行 Redis。有關詳細說明,請參閱 Docker Redis 倉庫。 |
現在應該能夠訪問 localhost:8080/ 上的應用了
工作原理
我們在以下所示的 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
,而是將值持久化到 Redis 中。Spring Session 會在你的瀏覽器中建立一個名為 SESSION
的 cookie。該 cookie 包含你會話的 ID。你可以檢視 cookie(使用 Chrome 或 Firefox)。
可以使用 redis-cli 刪除會話。例如,在基於 Linux 的系統上,可以輸入以下內容
$ redis-cli keys '*' | xargs redis-cli del
Redis 文件提供了關於安裝 redis-cli 的說明。 |
或者,你也可以刪除明確的鍵。在你的終端中輸入以下內容,確保將 7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
替換為你 SESSION cookie 的值
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
現在你可以訪問 localhost:8080/ 上的應用,會看到我們新增的屬性不再顯示。