jsonp确实和ajax没有半毛钱关系,只算是一种机制跨域数据获取方案或者协议。
只是说不少库(好比jquery)里面对jsonp和ajax作了同样的封装,看起来就好像jsonp是ajax的一部分同样,这好像会形成误解。php
ajax是使用js内置的对象进行网络请求获取数据前端
jsonp是使用script当中的src来获取数据jquery
一个域名访问另一个域名ajax
一、如下是形成跨域的一些状况,只有目录路径不一样才是同源地址json
一个域名地址须要访问另一个域名地址的数据segmentfault
-->说白了是为了数据的安全跨域
出于安全性考虑,浏览器不容许ajax跨域获取数据浏览器
浏览器为了保证数据的安全,不容许直接请求使用别的域名数据。浏览器作了一个拦截。其实数据已经响应到了浏览器。浏览器没有把它给咱们,不会随意注入你的浏览器。例如黑客会经过重定向把一些你不想打开的网页在你的浏览器中打开安全
-->浏览器服务器
需求:当用户当请求一个地址要拿到里面的数据展现在本身的域名当中
现实:拿不到数据显示在本身的域名当中
缘由:当你访问地址的时候,实际上数据已经从别的域名拿过来了(能够从network上的接收包查看),可是浏览器为了保障不被信用的数据注入本地,进行了拦截。
一、在浏览器安装插件(本身百度)
二、经过src实现跨域方案
讲第二种方法以前先了解一下基本概念:
使用src内容请求是不会存在跨域问题,在服务器端,返回js语句是能够直接运行。
服务器或者说后台(php)不存在跨域问题,当遇到跨域问题时经过PHP文件(自身文件)进行访问。
因此经过第二种方式解决跨域,必须先后台的合做才能私行(前台传callback参数,后台服务器接收callback并返回数据)。步骤:
0.在前端定义一个function.
function fn(res) {
alert(res);
}
1.经过<script src=> 向服务器发送一个请求。 在发送请求过程中。把function的名称作为参数传给服务器。
<script src="get.php?callback=fn"></script>
2.服务器接收callback值。
$fn = $_GET['callback'];
3.在返回时,在接收参数这后面拼接一个括号。
若是想要传递数据,就把数据放到括号当中。
echo $fn.'("xmg123")';
4.就会执行前端定义的function
fn("hello");
jsonp不是使用xhr对象发送请求,而是建立一个script标签,标签的src属性设置成要请求的URL。当标签插入dom时浏览器就会自动请求这个URL,并把结果当作js代码执行。这样作的优势是跨域,缺点是只能使用get,并且不能设置header。由于请求彻底不受js控制
jsonp的限制是来源于src的限制,src是不可能作到post请求的
有一篇讨论帖能够解答 https://segmentfault.com/q/1010000004884037