导读:
跨域问题是在做项目时经常会遇到的问题,之前解决跨域问题是通过jsonp来解决,但是jsonp只能发起GET请求,如果需要发起POST或者做文件上传,那么jsonp就不能够解决了,所以接下来我们探讨下如何使用CORS技术来解决该问题。
什么是跨域?
浏览器有同源策略,所以ajax请求时,只要是域名不同、或者是端口不同就会导致跨域问题cors跨域,如下:
解决跨域的方法:
目前常见的解决跨域的方法有2种:
jsonp
jsonp的原理是借助于的src可以跨域请求资源的特性去加载资源,
然后将资源当做是js来解析,
那么就要求服务端返回数据时需要用一个对调函数对数据进行包裹,
在客户端定义该回调函数,就可以获取到数据。
CORS
CORS是一个W3C标准,全称是"跨域资源共享"(Cross- )。
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。
浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
两种方法的总结:
jsonp和cors都需要服务端的配合才能完成;
jsonp只支持get请求,兼容各种浏览器;
cors支持各种请求,IE低版本浏览器不支持;
CORS的用法:
CORS的使用有2种模式:
简单模式
请求方法是GET、POST、HEAD的请求
或者有自定义头信息
非简单模式
请求方法是PUT、的请求
文件上传
有自定义的头信息
浏览器对CORS的支持情况:
还是很乐观的哈~~
简单模式:
用法和普通的ajax请求没什么区别,如图:
请求:
服务端(代码):
注意:服务端无需用回调函数包裹了~~~~
非简单模式:
当浏览检查到该跨域请求是非简单模式时,需要向服务端发送2次请求:
第一次请求是预检请求,该请求是类型;
如果浏览器检测到服务端有响应,并且表明支持跨域cors跨域,那么就会发起真正的请求去提交数据,否则就报错,终止请求;
演示:
客户端:
请求:
第一次请求:
第二次请求(真正的请求数据):
服务端:(的配置文件)
代码(没有变化):
注意:的版本在4.2以上才支持该配置。
总结:
CORS技术是一种新的解决跨域方法,其灵活度要高于jsonp,开发起来更加简单,当然了,还得根据不同的需求来正确选择不同的解决方案,技多不压身嘛~~