不同域名间的session共享

由于公司业务需求,需要切换域名且保持用户的登录状态,所以开始了对不同域名(二级域名)做session同步。
思路:
1、 保证两个tomcat及域名的正常访问
2、 浏览器拿到的域名sessionId一致
3、 服务能共享登录状态
主要步骤:
1、 安装、复制tomcat,并开放tomcat占用的端口
2、 设置域名(同级的二级域名)
3、 设置域名session一致
4、 redis记录session状态,达到共享

第一步:安装并复制一个tomcat,在linux或者阿里云后台开放端口
1、 安装复制tomcat(略)。
tomcat1端口配置:8005 8080 8009
tomcat2端口配置:8004 8090 8008
2、 开放端口8080,8090,使nginx能正常访问端口
linux:
1、# /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
2、# /etc/init.d/iptables restart
3、# /etc/rc.d/init.d/iptables save
参考资料: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,在标签上添加:


两个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,在标签中添加:



这样,插件就会将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。
代码示例:

Jedis jedis = jedisPool.getResource();
   jedis.select(0);//使用db0

在登录后,获取到sessionId,作为key,登录信息:如isLogin,memberId作为value写入redis。保存实现登录状态。
在使用session访问用户信息时,如访问不到,则在redis中访问用户信息,实现登录状态共享
目的二:实现登录
总结:
由于是linux的小白,所以在配置tomcat及session一直的时候,花费了很多时间,也找了很多资料。虽然基本上用到的知识都是在网上搜的,但是收获还是挺大。中间有很多不足,还有一些不懂的地方,希望能有大佬能给与一些指正与解答(万分感谢)。

你可能感兴趣的:(服务器)