首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

分布式 Session 共享實戰:Tomcat + Redis 實現 Session 同步(基於 tomcat-redis-session-manager)

     編輯:Java 綜合教學

項目背景與環境

本文記錄在 Windows 環境下,利用 tomcat-redis-session-manager 插件實現多 Tomcat 實例間 Session 共享的完整流程。測試環境:

組件版本端口
Tomcat17.0.618081
Tomcat27.0.618082
Redis2.4.56379
JDK1.7-

核心步驟

1. 獲取並編譯插件源碼

官方發布的 JAR 包存在 Bug 且版本過舊,建議從 GitHub 下載源碼自行編譯:

git clone https://github.com/jcoleman/tomcat-redis-session-manager

項目使用 Gradle 構建,需配置 GRADLE_HOME 並修改 build.gradle:

  • 註釋掉 signing 相關腳本及 Sonatype 倉庫配置;
  • 將 Tomcat、Jedis、Commons Pool2 依賴版本改為與當前環境一致(如 7.0.61、2.5.2、2.2);
  • 新增 copyJars 任務將輸出 JAR 複製到 dist 目錄。

執行編譯命令:

gradle build -x test copyJars

2. 部署 JAR 包並修改 context.xml

將 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 實例均需相同配置。

3. 驗證測試

  1. 依次啟動 Redis、Tomcat1、Tomcat2;
  2. 瀏覽器分別訪問 https://localhost:8081/examples/servlets/servlet/SessionExample 與 https://localhost:8082/...;
  3. 觀察兩邊顯示的 Session ID 完全一致;
  4. 使用 redis-cli 執行 KEYS * 確認 Redis 中存儲的 Session 鍵值。

常見坑點提示

  • JDK 版本不匹配:源碼要求 JDK 1.7+,若使用 1.6 會拋 UnsupportedClassVersionError;
  • Tomcat 版本不一致:build.gradle 中的 tomcat-catalina 版本必須與實際運行版本一致;
  • 直接下載 JAR 包不可用:官方下載頁面的 JAR 目錄結構與源碼不符,務必自行編譯。

總結

通過 tomcat-redis-session-manager 實現 Session 共享屬於「非侵入式」方案,無需修改應用代碼,僅需配置容器層面,適合快速遷移舊系統至分布式架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved