单点登录
来源:8-7 Jackson和fastJson到底有啥区别?
Irregularity
2020-10-22
单点登录这个目前应用的场景还是比较多的,很多系统对接会用到,请问针对单点登录,通常企业级开发中是怎么去实现的呢?
1回答
-
同学你好:
单点登录几乎是大型系统必备的“技能”,但是,不得不说,这都是成熟的系统了,确实没有必要再去研究这种东西了(从 0 做起的可能性太低且没有意义)。我这里就简单的说下单点登录的实现思想。
首先,你要知道单系统是怎么实现登录的,是利用 Cookie 和 Session,记录用户的身份信息。那么,多系统的情况下我们仍然还是需要 Cookie 和 Session,但是会出现几个问题:
(1)Session 在多系统之间不共享的问题
(2)Cookie 的跨域问题
所以,单点登录的实现目标就是去解决单系统登录的这两个问题。
第一个问题:Session 在多系统之间不共享的问题
单系统登录功能主要是用 Session 保存用户信息来实现的,但我们清楚的是:多系统即可能有多个 Tomcat,而 Session 是依赖当前系统的 Tomcat,所以系统 A 的 Session 和系统 B 的 Session 是不共享的。
解决系统之间Session不共享问题有一下几种方案:
(a)Tomcat 集群 Session 全局复制(集群内每个 tomcat 的 session 完全同步)【会影响集群的性能,不建议】
(b)根据请求的 IP 进行 Hash 映射到对应的机器上(这就相当于请求的 IP 一直会访问同一个服务器)【如果服务器宕机了,会丢失了一大部分Session的数据,不建议】
(c)把 Session 数据放在 Redis 中(使用 Redis 模拟 Session)【建议】
第二个问题:Cookie 的跨域问题
比如说,我们请求 <https://www.google.com/> 时,浏览器会自动把 google.com 的 Cookie 带过去给google 的服务器,而不会把 <https://www.baidu.com/> 的 Cookie 带过去给 google 的服务器。
这就意味着,由于域名不同,用户向系统 A 登录后,系统 A 返回给浏览器的 Cookie,用户再请求系统B的时候不会将系统 A 的 Cookie 带过去。
针对 Cookie 存在跨域问题,有几种解决方案:
(a)服务端将 Cookie 写到客户端后,客户端对 Cookie 进行解析,将 Token 解析出来,此后请求都把这个Token 带上就行了
(b)多个域名共享 Cookie,在写到客户端的时候设置 Cookie 的 domain
(c)将 Token 保存在 SessionStroage 中(不依赖 Cookie 就没有跨域的问题了)
到这里,我们已经可以实现单点登录了。
我是勤一,致力于将这门课程的问答区打造为 Java 知识体系知识库,Java 知识体系 BBS!共同建造、维护这门课程,我需要每一个你!
212020-10-26
相似问题