JSONP跨域相关问题
问题起源:
由于同源策略,AJAX
直接请求非同源数据接口存在跨域无权限访问的问题。
JSONP跨域原理:
利用了src
不受同源策略的影响 ,可以访问非同源的数据。
源生JS实现JSONP的步骤:
客户端
- 定义获取数据后调用的回调函数
- 动态生成对服务端JS进行引用的代码
- 设置
url
为提供jsonp
服务的url
地址,并在该url
中设置相关callback
参数 - 创建
script
标签,并设置其src
属性 - 把
script
标签加入head
,此时调用开始。
- 设置
服务端
将客户端发送的callback
参数作为函数名来包裹住JSON
数据,返回数据至客户端。
AJAX与JSONP的异同:
AJAX
和JSONP
这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url
,然后把服务器返回的数据进行处理,因此jQuery
和extjs
等框架都把JSONP
作为AJAX
的一种形式进行了封装;- 但
AJAX
和JSONP
其实本质上是不同的东西。AJAX
的核心是通过XmlHttpRequest
获取非本页内容,而JSONP
的核心则是动态添加script
标签来调用服务器提供的js脚本。 - 所以说,其实
AJAX
与JSONP
的区别不在于是否跨域,AJAX通过服务端代理一样可以实现跨域,JSONP
本身也不排斥同域的数据的获取。 - 还有就是,
JSONP
是一种方式或者说非强制性协议,如同AJAX
一样,它也不一定非要用JSON
格式来传递数据,如果你愿意,字符串都行,只不过这样不利于用JSONP
提供公开服务。 - 总而言之,
JSONP
不是AJAX
的一个特例,哪怕jQuery
等巨头把它封装进了AJAX
,也不能改变这一点!
最后,
JSONP
跨域只支持get
方式的跨域,post
是不支持的。
一个JSONP
跨域的例子。