JavaScript跨域问题之CORS方法与JSONP的对比

来源:互联网 发布:java 二分法排序代码 编辑:程序博客网 时间:2024/05/29 18:03

什么是跨域?
只要协议、域名、端口有任何一个不同,都会被当成不同的域。而JavaScript同源政策的限制,无法进行跨域调用

解决方法:
1.跨域资源共享(CORS):
定义了在访问跨域资源时,浏览器与服务器应该如何沟通。背后的基本思想就是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。
服务器对于CORS的支持,主要通过设置Access-Controll-Allow-Origin来进行。如果浏览器检测到相应的设置,就允许ajax进行跨域访问

2.通过jsonp跨域:
什么是jsonp?相信很多人在刚接触jsonp时都会有这个疑问的。维基百科是这样定义的:JSONP(json with padding),是json的一种使用模式,可以让网页从别的网域要资料(即跨域)。

jsonp其实是由两部分组成的:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的json参数。利用的是script标签中src可以引用不同域上js文件的思想,进行跨域。

jsonp的优点:
它不像XHR对象实现ajax请求那样受到同源政策的限制,它的兼容性更好,XHR在进行ajax请求时,为了兼容IE,还需创建ActiveX对象。并且在请求完毕之后可以通过回调函数的方式将结果回传

jsonp的缺点:
它只支持get请求而不支持post等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用问题

CORS与JSONP对比:
CORS无疑更为先进,方便和可靠。

  1. jsonp只能实现get请求,而CORS支持所有类型的HTTP请求
  2. 使用CORS,开发者可以使用普通的XHR发起请求和获得数据,比起jsonp有更好的错误处理
  3. jsonp主要被老的浏览器支持,而绝大多数现代浏览器都已经支持CORS
0 0