导读:

跨域问题是在做项目时经常会遇到的问题,之前解决跨域问题是通过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的支持情况:

跨域cors解决方案_cors跨域_跨域cors使用说明

还是很乐观的哈~~

简单模式:

用法和普通的ajax请求没什么区别,如图:

请求:

服务端(代码):

跨域cors使用说明_跨域cors解决方案_cors跨域

注意:服务端无需用回调函数包裹了~~~~

非简单模式:

当浏览检查到该跨域请求是非简单模式时,需要向服务端发送2次请求:

第一次请求是预检请求,该请求是类型;

如果浏览器检测到服务端有响应,并且表明支持跨域cors跨域,那么就会发起真正的请求去提交数据,否则就报错,终止请求;

演示:

客户端:

请求:

跨域cors解决方案_跨域cors使用说明_cors跨域

第一次请求:

第二次请求(真正的请求数据):

服务端:(的配置文件)

跨域cors解决方案_跨域cors使用说明_cors跨域

代码(没有变化):

跨域cors使用说明_跨域cors解决方案_cors跨域

注意:的版本在4.2以上才支持该配置。

总结:

CORS技术是一种新的解决跨域方法,其灵活度要高于jsonp,开发起来更加简单,当然了,还得根据不同的需求来正确选择不同的解决方案,技多不压身嘛~~

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注