请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师您好,如果我要将分布式会话做成跨域、跨系统的单点登录,还有就是排他登陆应该怎么操作了,谢谢

正在回答 回答被采纳积分+3

2回答

龙虾三少 2019-05-27 18:50:03

你好,方案中需要做好几个事情:

  1. 可以依赖cookie存储登录标示的id,但是不要依赖cookie去传输sessionid,应该将id从cookie中取出后作为http的request或header的参数传给服务端验证

  2. 服务端在不同的系统之间需要共享会话存储,对应的sessionid可以放在集中式的redis中统一管理存取

  3. 然后sso需要考虑不同的sso系统之间的domain域名是否一致,比如一个是a.baidu.com,另一个是b.baidu.com因为domain都是baidu.com,自然就可以做到两个子域名间的cookie可以共享了,但若是在不同的domain域名下,比如a.baidu.com,b.sina.com需要sso则需要在用户访问a.baidu.com时发现没有登录态则跳转单点登录授权站login.com,登录授权后生成对应的code和cookie,cookie用于植入客户端浏览器标示login.com这个站点用户已经登录,code用户让客户端重定向到a.baidu.com的一个特定的sso地址上,然后在a.baidu.com对应的地址收到这个客户端转发过来的code后需要通过后端服务向login.com的域名发起对应的code验证,验证成功则生成一个属于a.baidu.com的cookie给客户端,这样客户端就算登录了a.baidu.com,同样的,党用户跳转b.sina.com的时候首先对应站点判断没有登录则跳转login.com,由于之前login.com的cookie已经植入标示登录过了,则直接返回对应的code给客户端重定向到b.sina.com,同样的道理b.sina.com通过code向login.com发起验证,通过后生成自己的cookie


1 回复 有任何疑惑可以回复我~
  • 提问者 慕神8359304 #1
    谢谢老师,那如果我要做排他登录,一个帐号同一时间只能登录一次,当第二次登录会把第一次登录给挤下去,这样需要怎么考虑呢
    回复 有任何疑惑可以回复我~ 2019-05-27 18:55:28
  • 如果是共享缓存的比较好操作 若发现同一个用户id已经登陆了 则需要清掉对应的sessionid 非共享的又不在一个domain下的除非不同domain每次都过来验证 否则做不了 但每次验证又会有性能问题 因此不同domain的一般不会做排他登陆
    回复 有任何疑惑可以回复我~ 2019-05-27 18:59:10
龙虾三少 2020-06-10 21:17:36

已回复

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号