同一个应用在运行多个tomcat实例的时候,经常需要共享Session。tomcat配置共享session有多种方式:
①利用tomcat自身集群特性进行配置;
②利用Memcache第三方缓存进行配置;
③利用Redis第三方缓存进行配置;
生产环境一般会使用了redis,所以主要是编译tomcat-redis-session-manager来达到tomcat利用redis进配置session共享。但是这个源码部分目前依然不支持Tomcat8,如果环境中用的Tomcat版本是7那么就无需更改源码直接编译即可,如果是Tomcat8则需要手动修改源码然后再进行打包。Tomcat7和Tomcat8的两个版本的编译打包好的jar可以下载 tomcat7&tomcat8-redis-session-manager-2.0.0.jar
1.下载源码
到github上讲源码拉取下来 https://github.com/jcoleman/tomcat-redis-session-manager
或者下载所需要的版本的压缩包 https://github.com/jcoleman/tomcat-redis-session-manager/releases
2.配置所需环境
从项目的源码中可以看出此项目需要使用Gradle进行编译的,所以先配置Gradle的环境
(1)下载Gradle 访问 https://gradle.org/releases/
如下图:点击下载,然后解压到一个目录下
(2)配置环境变量
win下 计算机 --> 属性 --> 高级系统设置 -->高级/环境变量(N) --> 系统变量
添加 GRADLE_HOME ,值配置成 Gradle的解压目录
修改Path 在Path中添加 ;%GRADLE_HOME%\bin;
(3)测试Gradle是否配置成功
在cmd中输入 gradle -version 能打印显示出版本信息,如下图:
3.修改项目的 build.gradle文件
将如下部分修改为自己的版本和配置
项目环境中的版本一致,同时还要考虑maven仓库中有对应的依赖包
apply plugin: 'java' apply plugin: 'maven' //本次用idea工具,如果用eclipse工具可以改为eclipse apply plugin: 'idea' apply plugin: 'signing' compileJava { sourceCompatibility = 1.8 targetCompatibility = 1.8 } dependencies { compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '7.0.68' // compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '8.0.52' compile group: 'redis.clients', name: 'jedis', version: '2.9.0' compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.4.2' //compile group: 'commons-codec', name: 'commons-codec', version: '1.9' testCompile group: 'junit', name: 'junit', version: '4.+' testCompile 'org.hamcrest:hamcrest-core:1.3' testCompile 'org.hamcrest:hamcrest-library:1.3' testCompile 'org.mockito:mockito-all:1.9.5' testCompile group: 'org.apache.tomcat', name: 'tomcat-coyote', version: '7.0.68' // testCompile group: 'org.apache.tomcat', name: 'tomcat-coyote', version: '8.0.52' } uploadArchives { repositories { mavenDeployer { beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } //这里记得也要注释掉,不然会提示userName和password错误 //repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { // authentication(userName: sonatypeUsername, password: sonatypePassword) //} //repository(url: "https://oss.sonatype.org/content/repositories/snapshots") { // authentication(userName: sonatypeUsername, password: sonatypePassword) //} ...
4.生成工具需要的文件夹
配置好Gradle后进入到项目源码的根目录下,执行如下命令 gradle idea
等待一段时间后提示 BUILD SUCCESSFUL 代表编译成功,如下图
5.将项目用导入到工具中
经过第4不我们就可以将项目用对应的工具打开,
例如IDEA,直接File --> New --> Project from Existing Sources... 导入,
导入后会下载项目所需依赖,加载完成后如下图
6.支持Tomcat8(如果生产环境中是Tomcat7可略过此步)
需要将 build.gradle 中的 tomcat-catalina 的版本修改为8的版本(不要引入太新的tomcat-catalina版本,最新版的LifecycleSupport不再支持,例如可以引入8.0.52)
然后找到 src/main/java下 com.orangefunction.tomcat.redissessions.RedisSessionManager.java ,此时这个类可能会报错,我们修改其中的 initializeSerializer() 方法,大概在728行,修改为如下:
按Ctrl + Alt + O更新导入的包。private void initializeSerializer() throws ClassNotFoundException, IllegalAccessException, InstantiationException { log.info("Attempting to use serializer :" + serializationStrategyClass); serializer = (Serializer) Class.forName(serializationStrategyClass).newInstance(); Loader loader = null; /*if (getContainer() != null) { loader = getContainer().getLoader(); }*/ // 修改为Tomcat8支持的语法 org.apache.catalina.Context context = this.getContext(); if(context != null){ loader = context.getLoader(); } ClassLoader classLoader = null; if (loader != null) { classLoader = loader.getClassLoader(); } serializer.setClassLoader(classLoader); }
7.打包
方法1,在项目中直接用Gradle的命令打包
tomcat-redis-session-manager > gradle build
方法2,点击Idea右侧栏中的Gradle,点击 Tasks --> build --> jar 双击运行
在项目中的build/libs/tomcat-redis-session-manager-2.0.0.jar就是我们刚编译的jar包