Java面试笔试面经、Java技术每天学习一点
Java面试
关注不迷路
作者:张永恒
来源:https://www.cnblogs.com/yonghengzh/p/13712729.html
在 B/S 系统中,登录功能通常都是基于Cookie来实现的.当用户登录成功后,一般会将登录状态记录到 Session 中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID或Token),并要求客户端在之后的每次请求中携带它们.在这样的场景下,使用 Cookie 无疑是最方便的,因此我们一般都会将Session的ID或Token保存到Cookie中,当服务端收到请求后,通过验证 Cookie 中的信息来判断用户是否登录.
单点登录(Single Sign On, SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统.举例来说,百度贴吧和百度地图是百度公司旗下的两个不同的应用系统,如果用户在百度贴吧登录过之后,当他访问百度地图时无需再次登录,那么就说明百度贴吧和百度地图之间实现了单点登录。
单点登录的本质就是在多个应用系统中共享登录状态.如果用户的登录状态是记录在Session中的,要实现共享登录状态,就要先共享 Session,比如可以将Session序列化到Redis中,让多个应用系统共享同一个Redis,直接读取Redis来获取Session.当然仅此是不够的,因为不同的应用系统有着不同的域名,尽管Session共享了
但是由于Session ID是往往保存在浏览器Cookie中的,因此存在作用域的限制,无法跨域名传递,也就是说当用户在app1.com中登录后,Session ID仅在浏览器访问app1.com时才会自动在请求头中携带,而当浏览器访问app2.com时,Session ID是不会被带过去的.实现单点登录的关键在于,如何让Session ID或Token在多个域中共享。
「实现方式一:父域 Cookie」