本文記錄在 Windows 環境下,利用 tomcat-redis-session-manager 插件實現多 Tomcat 實例間 Session 共享的完整流程。測試環境:
| 組件 | 版本 | 端口 |
|---|---|---|
| Tomcat1 | 7.0.61 | 8081 |
| Tomcat2 | 7.0.61 | 8082 |
| Redis | 2.4.5 | 6379 |
| JDK | 1.7 | - |
官方發布的 JAR 包存在 Bug 且版本過舊,建議從 GitHub 下載源碼自行編譯:
git clone https://github.com/jcoleman/tomcat-redis-session-manager
項目使用 Gradle 構建,需配置 GRADLE_HOME 並修改 build.gradle:
signing 相關腳本及 Sonatype 倉庫配置;copyJars 任務將輸出 JAR 複製到 dist 目錄。執行編譯命令:
gradle build -x test copyJars
將 dist 目錄下所有 JAR 放入 Tomcat/lib 目錄(刪除重複舊包)。修改 conf/context.xml,添加:
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost" port="6379" database="0" maxInactiveInterval="60" />
兩個 Tomcat 實例均需相同配置。
https://localhost:8081/examples/servlets/servlet/SessionExample 與 https://localhost:8082/...;redis-cli 執行 KEYS * 確認 Redis 中存儲的 Session 鍵值。UnsupportedClassVersionError;build.gradle 中的 tomcat-catalina 版本必須與實際運行版本一致;通過 tomcat-redis-session-manager 實現 Session 共享屬於「非侵入式」方案,無需修改應用代碼,僅需配置容器層面,適合快速遷移舊系統至分布式架構。