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文件上加上如下内容

    <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
    host="localhost"
    port="6379"
    password=""
    database="0"
    maxInactiveInterval="60" />

如图:

 

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

 

        添加到SESSION的代码

 获取SESSION的代码

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

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

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

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

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

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

好了,开始测试吧!

 

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

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

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

然而,事情还没有完!

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

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

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

 

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

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值