跨域问题,CORS
CORS(跨源资源共享),使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是成功或失败。
- IE实现CORS
1
2
3
4
5
6
7// ie中使用XDR
var xdr = new XDomainRequest();
xdr.onload = function(){
alert(xdr.responseText);
}
xdr.open('get', 'http://www.ajax.com/page');
xdr.send();
只能访问响应的原始文本,无法确定响应的状态码1
2
3
4// 指定一个error处理
xdr.onerror = function(){
alert('error');
}
xdr支持超时属性及超时事件处理。
对于post请求,使用contentType来表示发送数据的格式。1
2
3xdr.open('post', 'http://www.ajax.com/page');
xdr.contentType = 'application/x-www-form-urlencoded';
xdr.send('name=1&value=2');
- 其他浏览器对CORS的实现
使用标准的xhr对象,在open中传入绝对的url
1 | var xhr = createXHR(); |
- 两种对CORS的实现的区别(简单请求)
XDR:
- cookie不会随请求发送,不会随响应返回。
- 只能设置请求头部信息中的Content-Type。
- 不能访问响应头部信息。
- 只支持GET和POST。
- 请求都是异步执行,不可以用来创建同步请求
- open方法只接受两个参数:请求的类型和url
XHR:
- 可以访问status和statusText
- 支持同步请求
- 不可使用setRequestHeader()设置自定义头部。
- 不能发送和接收cookie。
- 调用getAllResponseHeaders() 总返回空字符串
建议在请求本地资源时,使用相对URL,远程资源使用绝对URL。
- 跨浏览器的CORS
关于withCredentials:
默认情况下,一般浏览器的CORS跨域请求都是不会发送cookie等认证信息到服务端的,除非指定了xhr.withCredentials = true,但是只有客户端单方面的设置了这个值还不行,服务端也需要同意才可以,所以服务端也需要设置好返回头Access-Control-Allow-Credentials: true;还有一点要注意的,返回头Access-Control-Allow-Origin的值不能为星号,必须是指定的域,否则cookie等认证信息也是发送不了。
1 | function createCORSRequest(method,url){ |
其他跨域技术
- 图像ping
只能是get请求,无法访问响应文本,且只能用于浏览器与服务器间的单项通信。
1 | var img = new Image(); |
- JSONP
JSON with padding(参数式JSON),是被包含在函数调用中的JSON。
由两部分组成:回调函数和数据,通过动态的