JSONP

170 阅读2分钟

Jsonp是一种跨域的解决方式,我的理解是Jsonp利用的script标签不会受同源策略影响的特性来处理跨域问题,在我们的html文件中是可以通过script嵌入js文件的,比如引入jquery之类的,我们通常用的是带有cdn的地址,很明显从同源的定义来看jquery文件和我们当前主机不是同源的,但是我们可以通过script标签引入使用。
补充为什么script不存在同源问题?
脚本的来源取决于脚本所嵌入的资源的来源,比如说访问A主机的当前HTML文件中有一个script标签,这个script标签的src属性请求了一个js脚本,因为这个脚本是由A主机的HTML文件的嵌入的script标签发起请求获取的,因此这个脚本的来源是属于A主机的。 到了这里,问题的答案也就出来了,jsonp的script标签请求回来的资源与当前域是相同的域,因此不受同源策略的影响。
所以Jsonp就是利用这个特性,首先会定义一个全局的回调函数,这个函数的参数就是得到的服务器传回来的数据,随后在script标签请求的时候会在query中增加一个属性XXXX?callback=func,即把我们定义的全局函数的名字作为value传给服务器,(这里就直接说了,因为Jsonp只能采用这种方式,所以其缺点是显而易见的,只能进行get请求,比较单一。),当服务器收到req之后会返回一个res,其中会将收到的func进行拼接,比如func({'XX':'data'}),这样传回来的时候,这个func函数相当于自动执行了,并且参数是有数据的,因而相当于获取到了不同源的数据,当然这个需要去和服务端的同学进行事先的沟通。