session多端登陆,共享怎么做的啊?

比如我登陆了百度账号,进贴吧时发现已经登录了,进糯米发现也自动登录了

再比如,我登陆淘宝,在打开支付宝,发现支付宝也登陆,进天猫发现天猫也登陆,退出天猫发现淘宝也退出了(但是支付宝好像不收影响)

还有登陆美团,再进美团外卖发现也登陆这个是怎么做的呢

感觉他们的账号是通用的,比如网易通行证,百度通行证,应用间登陆session 可以共享吗,tieba,是二级域名啊,PHPSESSION的cookie不能跨域吧,即使统一域名可以,那nuomi.com怎么能呢,真是邪门了。

记得以前Discuz有个UCenter Home是不是就是干这个啊?

这个知识点叫什么,多点登陆?多端登陆?session共享?

具体怎么做呢,这样的话SESSION应该不会存在文件里吧,用redis还是memcached,还是别的,都会有什么问题呢,能实现多端登陆,并且随时监控登陆设备,像qq安全中心那样吗?

目前我项目中就是用文件存的session,多个应用也是使用的同一账号,相当于通行证一样的模式,但是登陆时不同应用使用不同的session前缀,所以每次要分别登陆,都是存在一台服务器上面的,还经常发生session丢失,莫名其妙的自动退出问题,也没有办法监控得到用户登录情况,感觉不妙。

求大神指点一下,让我知道一下关键的知识点,我再去找资料?

阅读 14.9k
8 个回答

首先提醒一下题主不要被新技术吓到了,也不要去查什么SSO(Single Sign On,单点登录),那样只能增大你问题的复杂度和对这个问题的恐惧心理,其实真的没那么难。


我来帮你拆解下问题,你说的Session多端登录,其实可以拆解为Session共享+登录,不是什么高级的东西,无非是需要的Session值在让不同服务器不同域名的情况下都可以访问,让大家都读取同一个Session值,重要的是同一个session_id()值。这样的话,每台(服务器/项目)读取的都是同样的数据,既然都是读取同样的数据(尤其读取同样的session_id()值),那么我们不就可以凭借此标识符让不同用户显示不同的内容,多点登陆的问题不就解决了

(把问题简化,登录对于用户看来是一个特别的过程,在我们开发者看来无非就是让不同的人读取到不同的数据而已,而我们只需要获取那个登陆标识符即可)。

也就是说,session共享的关键技术点在于两点:

1. 让客户端访问同一个sessionId,
2. 让所有域名对应的服务器访问的Session的数据的位置必须一致

下面重点讲讲实现,Session共享相对于Cookie共享来说较为复杂,因为情况相对于比较多,大概有四种情况

同服务器同域名,同服务器不同域名,不同服务器同域名,不同服务器不同域名。

同服务器同域名(不同子域名)的实现:

实现比较简单,直接找一份网上的demo(图侵删),直接按照以下的代码实现即可。
图片描述

同服务器不同域名的实现:

这种情况下,我们再次明确实现session共享的关键技术点,同一个sessionId同样的数据源
不同域名的话就要先将cookie('PHPSESSID')跨域,然后通过这个sessionid值从MySQL数据库或者Nosql中取得对应数据,这样就实现了同服务器不同域名的session共享。
首先是cookie跨域:
图片描述

然后是Redis数据共享,key就是session_id,值就是需要共享的数据,使用到的就是Redis的集群技术,实例过于复杂,感兴趣的可以直接去文章查看:redis cluster 集群 安装 配置 详解

不同服务器同域名的实现:

此种情况与<同服务器不同域名的实现>差不多,但在此种情况下不需要考虑cookie跨域的问题了,那么着重实现数据共享即可,同上,key为sessio_id,值为具体的数据值,参考文章同上redis cluster 集群 安装 配置 详解

不同服务器名不同域名的实现:

此种情况和<同服务器不同域名的实现>图探访,也是要实现两个目标,同一个sessionId同样的数据源。不同域名的话就要先将cookie('PHPSESSID')跨域,然后通过这个sessionid值从MySQL数据库或者Nosql中取得对应数据,这样就实现了同服务器不同域名的session共享。
首先是cookie跨域:
图片描述

然后是Redis数据共享,key就是session_id,值就是需要共享的数据,使用到的就是Redis的集群技术,实例过于复杂,感兴趣的可以直接去文章查看:redis cluster 集群 安装 配置 详解

我们发现四种情况下的解决方式都差不多,第2种情况<同服务器不同域名的实现>和第四种情况<不同域名不同服务器的实现>更是基本一样,其中的核心思想无非就是解决两个根源问题,session_id大家需要获取同一个,有一个共享的数据源需要给大家获取。

搞明白了这两点,Session共享的SSO也就水到渠成了。
有疑惑可直接在评论区询问,我会立即回答。

如果是同一个域名的,其实设置COOKIE就可以实现了,不同域名的话就是上面讲的SSO,单点登录,这个应该没有共享session,只是共享了登录状态。。负载均衡这种才会共享session

1.概述
session多端登录,就是保持session的一致性。由于session是唯一的,所以要保持session的唯一性,可以将session存放在一个地方,到时候大家取的时候,统一从一个地方取session,这样就保持了session的一致。
2.实现session的方法
其实就是将session存放在一个地方,大家存取就好了。至于其他都是附加的,原理就是酱紫。一般实现的方法有:
1)nfs文件共享系统,让不同项目访问同一个共享的文件。
2)存放在mysql。
3)存放在内存数据库,比如redis,memcache等。
4)基于cookie的共享。这个需要域名统一。
3.关于redis的session共享,其他类似
1)php.ini里面存放得有session的存放地址,可以将session的地址改成redis存放session的地址。session.save_path
但是一般这种服务器端会有访问控制。所以可以参考第二种方法
2)重写session,通过php代码更改session的存放路径什么的。php有相关的session重写的类。

谢邀
用单点登陆SSO 可以几个子站网站和主站用同一套登陆系统 例如CSDN 站长中国 就是这样干的
把登陆信息和token存在redis就可以 需要考虑redis命中率问题

也就是SSO,单点登录

用cas单点登录开源框架,支持php,.net,java

单点登录 SSO

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏