不同域名间的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一直的时候,花费了很多时间,也找了很多资料。虽然基本上用到的知识都是在网上搜的,但是收获还是挺大。中间有很多不足,还有一些不懂的地方,希望能有大佬能给与一些指正与解答(万分感谢)。