1.会话机制
a.浏览器在第一次访问Tomcat服务器的时候,Tomcat服务器会在服务端创建session对象,并存储到map中.key是session的id,value是session对象本身.
b.在响应的时候会把session的id通过cookie的方式写到客户端浏览器中.
c.浏览器会在本地的目录中把session的id写入到本地的cookie中.
d.在后续的请求中,都会读取本地的cookie中的内容,并在请求的时候带上对应的cookie.
2.登录机制
有了会话机制,登录状态就好明白了,我们假设浏览器第一次请求服务器需要输入用户名与密码验证身份,服务器拿到用户名密码去数据库比对,正确的话说明当前持有这个会话的用户是合法用户,应该将这个会话标记为“已授权”或者“已登录”等等之类的状态,既然是会话的状态,自然要保存在会话对象中,Tomcat在会话对象中设置登录状态如下:
HttpSession session = request.getSession();
session.setAttribute("isLogin", true);
再次访问时,tomcat在会话对象中查看登录状态:
HttpSession session = request.getSession();
session.getAttribute("isLogin");
实现了登录状态的浏览器请求服务器模型如下图描述
===========================================================================
随着公司的发展,公司内部使用的系统越来越多.但是对于使用系统的员工来说不是个好事情.
1.每个系统都需要记住对应的账号和密码,很多员工都是每个系统的账户和密码都一样的.
2.如果同时要使用CRM系统,WMS系统,OA系统,用户需要登录三次.
3.如果不使用了,还需要分别在三个系统中依次的注销.
有没有这样的功能:我只需要登录一次,公司里面所有的系统都可以使用.只需要注销一次,所有的系统都退出登录了.
如果能实现这样的功能就非常好了.
虽然单系统的登录解决方案很完美,但对于多系统应用群已经不再适用了,为什么呢?
单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器与服务器之间维护会话状态。但cookie是有限制的,这个限制就是cookie的域(通常对应网站的域名),浏览器发送http请求时会自动携带与该域匹配的cookie,而不是所有cookie
既然这样,为什么不将web应用群中所有子系统的域名统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。
然而,可行并不代表好,共享cookie的方式存在众多局限。首先,应用群域名得统一;其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;第三,cookie本身不安全。
因此,我们需要一种全新的登录方式来实现多系统应用群的登录,这就是单点登录