Java tomcat 实现二级域名session共享(良心共享)

本文主要目的:一个用户在一台服务器的用户中心登录后产生的SESSION,然后访问在不同的服务器上的不同二级域名的应用都能共享到这个用户登录后的SESSION,可以说是单点登录。


用到的技术:J2E,Tomcat,Redis,Cookie


先阐述两个概念:

1)什么是一级域名和二级域名? 比如说你有一个域名是  aa.com  ,那么aa.com就是你这个域名的一级域名,www.aa.com和app.aa.com是这个域名的二级域名。可以简单地理解为,你的域名中含有多少个点(.)就是多少级域名(不知道这个理解是否完全正确哈)。

2)SESSION是根据什么划分的? 页面前端决定是不是同一个SESSION看三样东西:SESSION的Value、Domain和Path。如果这三样东西都相同,后台就是根据这三个值来维护SESSION的。这篇文章就是利用了这一特性。


所以,我想要做的事情是指在 passport.aa.com下面进行用户登录后,访问 www.aa.com和app.aa.com下的应用都是登录状态的。我相信你在看到我的这篇文章之前,可能已经在网上找了一大推的例子了。So am l,只可惜,并没有解决我的问题,很多方法都是无法使用的,所以才会有这篇文章的产生。废话不多说了,开始吧!


首先,如果是将SESSION交给spring-session来管理的话,这里有一点要注意下的是,生成的SESSION  ID的key是叫SESSION,不是JSESSIONID。对比下下面两图。



我使用的是Tomcat的 RedisSession 管理,下载  所依赖的jar包, 点击这里。将下载好的jar包放到Tomcat的lib下面,然后在Tomcat 的conf/context.xml文件上加上如下内容

   
        host="localhost"
    port="6379"
    password=""
    database="0"
    maxInactiveInterval="60" />

如图:Java tomcat 实现二级域名session共享(良心共享)_第1张图片



Okay,准备好这些工作后,我们看下后台的Java代码怎么写


        添加到SESSION的代码

Java tomcat 实现二级域名session共享(良心共享)_第2张图片

        获取SESSION的代码

Java tomcat 实现二级域名session共享(良心共享)_第3张图片

其实我们用的是一个小技巧就是利用Cookie来模仿一个SESSION ID 的 Key,Value,Domail,Path都一致的Session cookie。好了,将写好的项目部署到线上(这个要在线上,并使用域名来进行访问,否则不好测试)。

我部署的是一个多服务器多Tomcat下的结构,这里Tomcat都链接了同一个Redis服务器, 结构大概是这样:

服务器一 有一个 tomcat ,部署着刚才的写好的程序,目录名 是user;

服务器二有一个 tomcat ,部署着刚才的写好的程序,目录名 是node;

服务器三有一个 tomcat ,部署着刚才的写好的程序,目录名 是node;

服务器二和三使用Nginx的反向代理,做了负载。


好了,开始测试吧!


Java tomcat 实现二级域名session共享(良心共享)_第4张图片

Okay,看到预期的两个一样的SESSION ID,尝试下不同的二级域名下是否能拿到数据:


Java tomcat 实现二级域名session共享(良心共享)_第5张图片


So far so good!不停刷新下,发现都是能获取到数据的,如果我一开始的时候不做负载,多搞一个二级的域名来访问可能会更好理解些,但楼主就偷下懒不去修改这个缺点了,大家可以去尝试下!


=======================发愁的分割线============================

然而,事情还没有完!

如果我将所有的SESSION清除掉,先访问服务器二获取SESSION的接口,然后再访问服务器一的加SESSION的接口,那么结果会是怎样呢?

Java tomcat 实现二级域名session共享(良心共享)_第6张图片Java tomcat 实现二级域名session共享(良心共享)_第7张图片


完蛋了,你会发现在请求服务器二的时候重新生成了一个SESSION ID ,两个ID的Value不一样了。

不用急,利用你一开始的加SESSION的道理,将SESSION也导回到服务器一的后台上去就可以了,在原来获取SESSION的代码上简单改进下:

Java tomcat 实现二级域名session共享(良心共享)_第8张图片

这样在服务器一创建SESSION的时候也可能是用到服务器二的SESSION ID了!


圆满结束!代码获取,点这下载,再分享一款 Redis的可视化管理工具 redis-desktop-manager,点这下载









你可能感兴趣的:(关于工作)