互联网|10张流程图+部署图,讲透单点登录原理与简单实现


一、单系统登录机制
1、http无状态协议
web应用采用browser/server架构 , http作为通信协议 。 http是无状态协议 , 浏览器的每一次请求 , 服务器会独立处理 , 不与之前或之后的请求产生关联 , 这个过程用下图说明 , 三次请求/响应对之间没有任何联系
互联网|10张流程图+部署图,讲透单点登录原理与简单实现
本文插图

但这也同时意味着 , 任何用户都能通过浏览器访问服务器资源 , 如果想保护服务器的某些资源 , 必须限制浏览器请求;要限制浏览器请求 , 必须鉴别浏览器请求 , 响应合法请求 , 忽略非法请求;要鉴别浏览器请求 , 必须清楚浏览器请求状态 。 既然http协议无状态 , 那就让服务器和浏览器共同维护一个状态吧!这就是会话机制
2、会话机制
浏览器第一次请求服务器 , 服务器创建一个会话 , 并将会话的id作为响应的一部分发送给浏览器 , 浏览器存储会话id , 并在后续第二次和第三次请求中带上会话id , 服务器取得请求中的会话id就知道是不是同一个用户了 , 这个过程用下图说明 , 后续请求与第一次请求产生了关联
互联网|10张流程图+部署图,讲透单点登录原理与简单实现
本文插图

服务器在内存中保存会话对象 , 浏览器怎么保存会话id呢?你可能会想到两种方式
1. 请求参数
2. cookie

将会话id作为每一个请求的参数 , 服务器接收请求自然能解析参数获得会话id , 并借此判断是否来自同一会话 , 很明显 , 这种方式不靠谱 。 那就浏览器自己来维护这个会话id吧 , 每次发送http请求时浏览器自动发送会话id , cookie机制正好用来做这件事 。
cookie是浏览器用来存储少量数据的一种机制 , 数据以”key/value“形式存储 , 浏览器发送http请求时自动附带cookie信息
tomcat会话机制当然也实现了cookie , 访问tomcat服务器时 , 浏览器中可以看到一个名为“JSESSIONID”的cookie , 这就是tomcat会话机制维护的会话id , 使用了cookie的请求响应过程如下图
互联网|10张流程图+部署图,讲透单点登录原理与简单实现
本文插图

3、登录状态
有了会话机制 , 登录状态就好明白了 , 我们假设浏览器第一次请求服务器需要输入用户名与密码验证身份 , 服务器拿到用户名密码去数据库比对 , 正确的话说明当前持有这个会话的用户是合法用户 , 应该将这个会话标记为“已授权”或者“已登录”等等之类的状态 , 既然是会话的状态 , 自然要保存在会话对象中 , tomcat在会话对象中设置登录状态如下
HttpSession session = request.getSession()session.setAttribute("isLogin", true)
用户再次访问时 , tomcat在会话对象中查看登录状态

HttpSession session = request.getSession()session.getAttribute("isLogin")
实现了登录状态的浏览器请求服务器模型如下图描述
互联网|10张流程图+部署图,讲透单点登录原理与简单实现
本文插图

每次请求受保护资源时都会检查会话对象中的登录状态 , 只有 isLogin=true 的会话才能访问 , 登录机制因此而实现 。
二、多系统的复杂性
web系统早已从久远的单系统发展成为如今由多系统组成的应用群 , 面对如此众多的系统 , 用户难道要一个一个登录、然后一个一个注销吗?就像下图描述的这样
互联网|10张流程图+部署图,讲透单点登录原理与简单实现
本文插图

web系统由单系统发展成多系统组成的应用群 , 复杂性应该由系统内部承担 , 而不是用户 。 无论web系统内部多么复杂 , 对用户而言 , 都是一个统一的整体 , 也就是说 , 用户访问web系统的整个应用群与访问单个系统一样 , 登录/注销只要一次就够了


推荐阅读