不同域名间的session共享
由于公司业务需求,需要切换域名且保持用户的登录状态,所以开始了对不同域名(二级域名)做session同步。
思路:
1、保证两个tomcat及域名的正常访问
2、浏览器拿到的域名sessionId一致
3、服务能共享登录状态
主要步骤:
1、安装、复制tomcat,并开放tomcat占用的端口
2、设置域名(同级的二级域名)
3、设置域名session一致
4、redis记录session状态,达到共享
第一步:安装并复制一个tomcat,在linux或者阿里云后台开放端口
1、安装复制tomcat(略)。
tomcat1端口配置:800580808009
tomcat2端口配置:800480908008
2、开放端口8080,8090,使nginx能正常访问端口
linux:
1、#/sbin/iptables-IINPUT-ptcp--dport8080-jACCEPT
2、#/etc/init.d/iptablesrestart
3、#/etc/rc.d/init.d/iptablessave
参考资料:https://www.cnblogs.com/dangzhensheng/p/4172109.html
阿里云:直接设置安全组,开放8080/8090端口
第二步:设置域名
1、公司使用的阿里云的域名,在域名顶级域名.xxxx.com的域名下,配置将要用到的test1.xxxx.com和test2.xxxx.com
2、配置nginx
在搭建的nginx服务器上,添加test1和test2的域名conf,指向tomcat1和tomcat2内网地址.(在实际配置的过程中,我在这里出了一个问题,配置的外网地址,也开放了端口,但是nginx不能正常访问到tomcat,不清楚是什么原因。后来配置成内网,正常访问)。
第三步:设置域名共享session
1、设置域名session一致
在tomcat中,找到conf中的context.xml,在<context>标签上添加:
<Contextpath=""docBase="ROOT"reloadable="false"useHttpOnly="true"sessionCookiePath="/"sessionCookieDomain=".你的一级域名.com">
两个tomcat都需要配置上,这样就能实现域名间session一致。
参考资料:https://blog.csdn.net/qq_39507276/article/details/79930309
2、将session记录到redis中
上述方法,能达到两二级域名间session一致,但是并不能保持session的用户信息。所以需要将session保存到redis或者其他缓存中间件中,以便程序能访问到session中的用户信息。
在tomcat层,使用了一个上传session到redis的插件:tomcat-redis-session-manager-tc8jdk8.jar。这个插件能将访问产生的session写入配置的redis中,使用到的jar包:
tomcat-redis-session-manager-tc8jdk8.jar
jedis-2.9.0.jar
commons-pool2-2.4.2.jar
在tomcat中,找到conf中的context.xml,在<context>标签中添加:
<Valveclassname="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/>
<Managerclassname="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="redis地址"port="redis端口号"database="0"password="密码"maxInactiveInterval="60"/>
这样,插件就会将tomcat产生的session以sessionId为key,value不清楚是什么的内容保存到redis上。
目的一:做完了这些工作,就已经达到了session一直的效果,启动tomcat之后,访问页面,在浏览器上能看到sessionId一致,redis上会有sessionId做key,value是几个乱码的内容。
参考资料:https://www.cnblogs.com/shihaiming/p/5917466.html
第四步:修改Java代码,使之达到登录状态共享
在我的代码逻辑上,两个tomcat上的两个服务,访问的同一个redis不同db。但是session记录在db0上,所以在使用的时候,都需要在db0上使用session信息。使用jedis的select()方法,能选择使用哪个db。
代码示例:
Jedisjedis=jedisPool.getResource();
jedis.select(0);//使用db0
在登录后,获取到sessionId,作为key,登录信息:如isLogin,memberId作为value写入redis。保存实现登录状态。
在使用session访问用户信息时,如访问不到,则在redis中访问用户信息,实现登录状态共享
目的二:实现登录
总结:
由于是linux的小白,所以在配置tomcat及session一直的时候,花费了很多时间,也找了很多资料。虽然基本上用到的知识都是在网上搜的,但是收获还是挺大。中间有很多不足,还有一些不懂的地方,希望能有大佬能给与一些指正与解答(万分感谢)。