session共享会话

现有需求如下:login.nx.com是nx.com的二级域名,login.nx.com是nx.com的登录中心应用,现在有两个拍马屁的网站(Sb.com、Sx.com)想跟nx.com共享登录,分享一下nx.com的用户资源,现在的整合登录的目标是: 任何一家网站登录后,到其他网站后都不需要再重新登录,姑且叫做良民通行证吧,(souhu人家也是这么叫的)

       我们都知道,要共享登录,一般情况下是需要共享应用session中的信息的,而session存储一般都是只在单台服务器的内存中的,其他服务器上的应用需要共享只有通过复制的方式,这是效率低下的,可以进行session改造,这里不具体讨论这个问题,可以参考《SNA session剖析》。通过上面一篇文章我们知道,登录相关信息可以存储在服务端,也可以存储在客户端,要和其他站点共享这些信息,就需要解决如何在所有站点下同步这些信息的问题,而解决同步的关键又在要解决跨域问题,以服务端存储为例:

           客户端cookie中只有sessionId,登录相关信息全部在服务端,通过sessionId在服务端即可获取登录信息,可以这么理解,只要sb.com、sx.com、nx.com具有相同的sessionId,那么在服务端他们就可以根据相同sessionId拿到登录状态,也就共享了登录信息,基于这个思路,解决方案有如下两个,各有优缺点:


1、  浏览器访问任何一个未登录网站都跳转到login.nx.com登录中心进行登录,登录成功后设置登录状态,并设置cookie保存sessionId,其中domain=.nx.com,此时,nx.com包括其子域名都能成功获取到sessionid,同时返回给客户端其他需要共享登录的域名列表,假设如下(这里除了使用script,其实ajax相关的技术都可以,例如iframe、img, XHR,另外注意下P3P 的问题):

     <script src=”http://sx.com/pass?sessionid=123456”></script>

     <script src=”http://sb.com/pass?sessionid=123456”></script>

     这里访问/pass目的只有一个,就是将sessioinid给相应的域名,然后/pass接收到  sessionId后写入到自己域名下cookie中,这样sx.com、sb.com域名下都有了这个sessionid,好,cookie设置大功告成,然后该页面再redirect到其他应该去的页面。只要在这几个域名下,就不需要再重新登录。

 

 

   优点:登录处统一设置登录相关cookie,集中管理, 除了第一次登录以外其他时候个系统各自为政,登入时统一重新创建sessionId,登出时如果session存储在服务端,则直接清除服务端即可,如果存储在客户端,则跟登录时一样,分别请求登出即可。

 缺点:但是登录时间会有点长,如果支持域名太多,这个估计有点郁闷了,不过支持过4-5个域名问题不大,如果session存储在客户端,则登出时间也可能会稍长。

 

2、 浏览器访问任何一个未登录网站(例如sx.com)都跳转到login.nx.com登录中心进行登录,登录成功后设置登录状态,并设置cookie保存sessionId,其中domain=.nx.com,此时,nx.com包括其子域名都能成功获取到sessionid,然后带着sessionId参数跳转到http://sx.com/pass?sessionid=123456&redirect_url=sx.com/xx.htm,sx.com/pass分析出sessionId后进行存储,然后跳转到sx.com/xx.htm目标页,此时这个页面是登录状态的。此时如果访问http://sb.com/yy.htm时,sb.com会先检查是否存在sessionid,如果不存在,则302跳转请求login.nx.com/pass?domain=sb.com&redirct_url=http://sb.com/yy.htm,由于之前login.nx.com已经登录,此时的请求会将该域名下的cookie中sessionId带到服务器,login.nx.com获取到sessionId后,组装成http://sb.com/pass?sessionid=123456&redirect_url=http://sb.com/yy.htm,这个过程,与sx.com处理过程一致,如此就完成了登录,如果存在sessionId则不需要去登录中心拿sessionid了。


优点:登录时间完全缩短,不论多少个应用都不会影响登录。

缺点:未登录也需要创建sessionId,因为如果没有sessionid,则每个需要登录信息的页面(那种登录与否都可以看的页面)都要去login.nx.com去访问一次,这样再nx的也受不了这样折腾啊,另外,由于未登录时sessionId已经生成,所以用户登录后这里会重复利用sessionid,除非浏览器关闭。另外登出时由于要清除所有域名下的sessionId,可能速度会有点慢,当然也可以不清除,那么在浏览器关闭之前,这个sessionId会被重复利用,可能稍微有点安全隐患。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值