单点登录

来源:8-7 Jackson和fastJson到底有啥区别?

Irregularity

2020-10-22

单点登录这个目前应用的场景还是比较多的,很多系统对接会用到,请问针对单点登录,通常企业级开发中是怎么去实现的呢?

写回答

1回答

张勤一

2020-10-22

同学你好:

    单点登录几乎是大型系统必备的“技能”,但是,不得不说,这都是成熟的系统了,确实没有必要再去研究这种东西了(从 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!共同建造、维护这门课程,我需要每一个你!


2
1
Irregularity
非常感谢!
2020-10-26
共1条回复

Java实操避坑指南 SpringBoot/MySQL/Redis错误详解

掌握业务开发中各种类型的坑,,Java web开发领域通用

471 学习 · 204 问题

查看课程