专栏名称: 前端JavaScript
分享 | 学习 | 交流 | 原创 分享是学习的开始;学习不必要从头开始,是从现在开始;交流能沟通你我,提高你的学识;期待你的加入!!! web前端技术交流,JavaScript,HTML5,CSS3……
目录
相关文章推荐
51好读  ›  专栏  ›  前端JavaScript

[S3-E383]jsonp 跨域原理分析

前端JavaScript  · 公众号  · Javascript  · 2017-07-13 06:41

正文

本文:【第3章第383回】 更多文章点击 目录 查看


AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。


AJAX 的出现使得网页可以通过在后台与服务器进行少量数据交换,实现网页的局部刷新。

但是出于安全的考虑,ajax不允许跨域通信(浏览器同源策略)。

如果尝试从不同的域请求数据,就会出现错误(跨域错误)。

在实际开发中,往往需要进行跨于请求,这时要怎么办呢?


关于ajax跨域请求?


1、Ajax为什么不能跨域?到底是卡在哪个环节了?。 (请求成功了,但客户端浏览器拿不到请求结果)


Ajax其实就是向服务器发送一个GET或POST请求,然后取得服务器响应结果,返回客户端。


理论上这是没有任何问题的,然而普通ajax跨域请求,在服务器端不会有任何问题,只是服务端响应数据返回给浏览器的时候,


浏览器根据响应头的Access-Control-Allow-Origin字段的值来判断是否有权限获取数据,


一般情况下,服务器端如果没有在这个字段做特殊处理的话,跨域是没有权限访问的,所以响应数据被浏览器给拦截了,


所以在ajax回调函数里是获取不到数据的。所以现在ajax跨域的问题可以转化为数据怎么拿回客户端的问题。


2、 html的script标签,img标签,iframe标签,可以请求第三方的资源(不受同源策略影响)


web页面可以加载放在任意站点的js、css、图片等资源,不会受到"跨域"的影响。


这个时候,我们会想到:既然我们可以调用第三方站点的js,那么如果我们将数据放到第三方站点的js中不就可以将数据带到客户端了吗?


JSONP


1、什么是JSONP?


JSONP(JSON with Padding(填充))是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。


其核心思想是利用JS标签里面的跨域特性进行跨域数据访问,

在JS标签里面存在的是一个跨域的URL,实际执行的时候通过这个URL获得一段字符串,

这段返回的字符串必须是一个合法的JS调用,通过EVAL这个字符串来完成对获得的数据的处理。


即:

一般情况下jqury 生成的访问 远程站点的 url默认情况下:(我所在的实际项目中的使用)


http://web.k3k.net/haila3/pt/tp/index.php/Home/User/getusergoto/?callback=jQuery191028614189839964865_1497261919344&token=420171c8-031a58667e64&_=1497261919346


上述代码请求生成的url(设置 jsonpCallback的值为 GetData )


http://web.k3k.net/haila3/pt/tp/index.php/Home/User/getusergoto/?callback=GetData&token=420171c8-00b8-031a58667e64&_=1497261919346


最后 一个 _=1497261919346 k v 是为了防止浏览器缓存,而由 jquery 自动增加上的。


所以相当于 在 前端文件中引入了 一个这样的js文件