现有多个应用,要求这几个应用统一通过一个网站(假设该网站的域名是login.com)登陆,若一个浏览器上成功登陆后,在同个浏览器下打开其他应用无需再次登陆,也就是一个浏览器只需登陆一次。
首先想到的是用cookie实现单点登陆:登陆成功后,login.com的服务器生成一个唯一的id并保存到一个表中,并向浏览器cookie中写入该id,当其他应用接收到请求时,先检查有无该id,若有则与login.com的登陆表中对照进行验证,若无则重定向到登陆网站。
但这种方式有一个跨域的问题。如果统一登陆的几个应用在和login.com在同一域名下,则可以获取cookie,如果分别在不同域名下,则无法获取到login.com的cookie.这样其他应用无法获取到login.com的cookie,其他应用的后台也就无法判断浏览器的登陆状态。
解决办法:login.com的登陆采用ajax方式无刷新登陆,在login.com登陆成功后,向浏览器发回相应,写入登陆id,然后浏览器再次向其他每一个应用的登陆action发送请求,请求参数就是该id。其他应用的action收到该请求后,先在login.com的表中验证,若验证成功则在session中保存该id,这样所有其他应用对应同个浏览器的session中都保存了login.com在该浏览器中写入的id,实现了cookie的共享。