本文目录:
一:SSO体系结构
SSO
体系结构
Token(令牌)
同域SSO原理分析
跨域SSO原理分析
二:Cookie增删改查
如何读取Cookie?
如何写入Cookie带浏览器?
修改Cookie
删除Cookie
三:跨域读写Cookie
1.利用HTML的script标签跨域写Cookie
P3P协议
2.通过URL参数实现跨域信息传递
3.读取其它域的Cookie
四:跨域Ajax请求
1.Jsonp的方式
2.CORS简介
CORS流程
3.两种跨域AJax请求对比
一:SSO体系结构
SSO
SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。
体系结构
当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录;根据用户提供的登录信息,认证系统进行身份校验,如果通过校验,应该返回给用户一个认证的凭据--token;用户再访问别的应用的时候就会将这个token带上,作为自己认证的凭据,应用系统接受到请求之后会把token送到认证系统进行校验,检查token的合法性。如果通过校验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了 。
Token(令牌)
token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识。
当用户第一次登录后,服务器生成一个token并将此token返回给客户端,客户端收到token后把它存储起来,可以放在cookie或者Local Storage(本地存储)里。以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。
简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。
设计token的值可以有以下方式
- 用设备mac地址作为token
- 用sessionid作为token
同域SSO原理分析
实际上,HTTP协议是无状态的,单个系统的会话由服务端Session进行维持,Session保持会话的原理是通过Cookie把sessionId写入浏览器,每次访问都会自动携带全部Cookie,在服务端读取其中的sessionId进行验证实现会话保持。同域下单点登录其实就是手写token代替sessionId进行会话认证。
token的生成
服务端生成token后,将token与user对象存储在Map结构中,token为Key,user对象为value,response.addCookie()生成新的Cookie,名为token,值为token的值。
token过期移除
将服务端的token从Map中移除,再删除浏览器端的名为token的Cookie。
认证流程
跨域SSO原理分析
当有多个系统时,认证机制的流程如下:
- 提供用户登录界面,供用户进行身份认证
- 用户验证通过后,生成新token
- 将tokenuser 对存入全局MAP中供校验
- 将token写入所有域的Cookie中
- 页面重定向回原始请求URL
分析
当系统有多个并且在不同域(domain)时,Cookie只会作用在当前域下。
将token写入所有域的Cookie中才是解决跨域SSO的核心。
二:Cookie增删改查
如何读取Cookie?
通过Servlet中的request对象可以读取到Cookie数组,然后foreach遍历读取,一般只是获取到nam和value,其他信息写入到浏览器后,浏览器不主动再发回来,读取并无意义。
Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { System.out.println( cookie.getName() + cookie.getValue() + cookie.getMaxAge() + cookie.getPath() + cookie.getDomain() + cookie.getSecure() + cookie.isHttpOnly()//客户端js是否可以获取 ); } }
如何写入Cookie带浏览器?
新建Cookie对象设置一系列属性,然后添加到response中去。需要注意的是,当设置path为“/”时,表示所有路径都会被该Cookie作用到,如果设置为/path1那么由/path2发起请求就不会携带该Cookie。默认不设置只作用在当前路径下。
Cookie cookie = new Cookie("myCookieName