本项目主要讲解的是单点登陆系统的原理及其实现。git
相关代码github连接。github
本章主要讲解的是同域下单点登陆分析。数据库
流程图虽然看着复杂,但你们不要被吓到啦^ _ ^,请你们参照着流程路,听我下面细细道来~~cookie
在github的代码中,我创建了三个项目,分别是服务端SSOServer、客户端SSOClient、以及两个集成了客户端的业务系统app1与aPP2。数据结构
将SSOServer,app1,app2启动后,开始SSO流程分析。app
未登陆访问业务系统app1的index页面:请求被客户端的Filter拦截。spa
因为没有token,客户端Filter控制其进行登陆操做,并将原始的URL做为请求的参数。设计
进入服务端的UserLoginServlet进行登陆操做。进入登陆页时,获取URL中的参数——原始的origRUL,将其做为request对象的属性,方便后人获取,而且跳转到服务端的登陆页面。3d
用户提交表单,服务端获取表单中信息后,到数据库中进行查询。若登陆失败,则返回原来的登陆页面,并携带原来的URL,将原始的URL做为表单的隐藏属性。对象
若登陆成功则:
1.生成token。
2.将token与其对应的user放到全局惟一数据结构中,方便全部人进行获取。
3.给该用户设置一个cookie,值为token,用户在下次访问的时候就会携带此cookie,服务端也就能够经过该cookie对其身份进行验证。
4.判断原始URL是否为空,若不为空则跳转到原始URL页面,不然跳转到成功登陆页面。
在用户要跳转到原始URL页面的时候,被客户端的Filter拦截,进行有无token的验证,因为通过登陆操做在cookie中已经生成了token,故Filter发送Http通讯请求服务端进行token有效性的验证,并将token做为请求参数。
服务端的TokenValidateServlet获取参数中的token后,到全局惟一数据结构中查找有无该token对应的user。若没有,则证实该token可能已经失效或是伪造的,则向客户端返回空字符串,不然返回查询到的user信息。
拦截器接收到服务端的返回信息,若为空字符串则返回原始登陆页面,并携带原始URL,不然经过传来的用户信息,对user对象进行还原,方便下我的获取,拦截操做结束,成功进入了业务系统的index页面,并将request对象携带的user信息显示出来。
在经过了客户端的拦截器以后,业务系统还能够自定义拦截器,从而根据用户信息获取与本系统相关的用户业务信息,或者是对用户的权限进行进一步的验证,如:"猪猪"不可访问index页面等QAQ。
服务端从request对象的cookie中获取token的值,将这个token从全局数据结构中移除,而且将用户保存有该token的cookie设置为无效的。
关于代码部分,我将会在下一章节中进行详细解释~~~你们多多关照!^ _ ^