造成跨域的两种策略
浏览器的同源策略会导致跨域,这里同源策略又分为以下两种:
DOM同源策略:禁止对不同源页面DOM进行操作(这里主要场景是iframe跨域的情况,不同域名的iframe是限制互相访问的)
XMLHttpRequest同源策略:禁止使用XHR对象向不同源的服务器地址发起HTTP请求。
只要协议、域名、端口有任何一个不同,都被当作是不同的域,之间的请求就是跨域操作。
为什么要有跨域限制
AJAX同源策略主要用来防止CSRF攻击,试想如果没有AJAX同源策略,我们发起的每一次HTTP请求都会带上请求地址对应的cookie(用户标识),那就相当危险了。因为一旦cookie泄露,攻击者就可以模拟用户进行一些非法操作了,所以,跨域限制主要是为了安全考虑。
跨域的解决方式
CORS
CORS(Cross-Origin Resource Sharing)即跨域资源共享,是一个W3C标准,大体流程:
- 对于客户端,我们还是正常使用xhr对象发送ajax请求,唯一需要注意的是,我们需要设置xhr的withCredentials属性为true,否则,cookie是不发送的。
- 对于服务器端,需要在响应头中设置如下两个字段:
1
2Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://www.domain.com
这样,我们就可以跨域请求接口了。
JSONP
我们知道,<script>
标签是不受同源策略的限制的,它可以载入任意地方的js脚本而并不要求同源。JSONP正是利用了这一点,通过动态添加<script>
标签来实现跨域请求。
JSONP的核心就是:允许用户传递一个callback参数给服务端,服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
1 | // Detect, normalize options and install callbacks for jsonp requests |
1 | /** |