Preflight请求至此也算是告一段落,之后浏览器会检查当前请求发出的源是否在服务端响应的Access-Control-Allow-Origin列出的源的列表中,如果是才会发送真正的请求。在实验过程中,浏览器并不一定要在服务器支持Preflight请求查询的请求方法和Header时才发送真正的请求,只要发出请求的源是合法的就会在Preflight请求之后把请求发出去。 JSONPJSONP 的全称是 JSON with Padding,译为被填充的JSON。前端在指定要请求的URL时可以通过和后端约定一个指定回调函数名称的参数,确保后台响应的脚本片段中调用了前端指定的回调函数,以此可以实现发送多个JSONP请求而且互不干扰。具体JSONP实现如下:
var delicious_callbacks = {};function jsonp(url, callback) { var uid = (new Date()).getTime(); delicious_callbacks[uid] = function (data) { delete delicious_callbacks[uid]; callback(data); }; url += "?jsonp=" + encodeURIComponent("delicious_callbacks[" + uid + "]"); var script = document.createElement('script') script.src = url document.body.appendChild(script)};jsonp("http://example.com/api", function(data) { // here we get the data });复制代码JSONP这种方式本身也是存在一定缺陷的,很明显它只能用于GET请求。另外,后端应用程序在处理过程可能会出现4xx、5xx错误或者遇到其他意外情况,导致无法返回正确的js函数调用格式的字符串的情况,所以还需要监听script标签的onerror事件来处理可能出现的意外情况。 Cookie跨域共享cookie作为客户端存储的一种方案,在客户端设置cookie也有以下几种方法: