关于跨域
Ajax是不能跨域的?什么是跨域?
比如我们本地的服务器地址是127.0.0.2:80去请求127.0.0.1:80中的文件内容,此时是不允许的,因为当前这个两个地址不在一个“域”,所以会报错;再比如127.0.0.1:80去请求127.0.0.1:3000也是不允许的,因为端口号也不同,所以也可以理解为不在一个“域”。
127.0.0.1:3000和127.0.0.1:80这种请求也是不允许的,因为这两个请求的ip地址是同一个,但是端口是不同的,端口号本质上没有什么不同,只是为了请求协议之前开辟一个专有的请求通道
JSONP
我们看下面一段代码
<script src="demo.js"></script> //定义了sayHello方法 <script> sayHello() //执行sayHello </script>
在demo.js 文件中定义了sayHello方法,然后我们在html页面中是可以调用这个方法的
此时我们调用和设置方法换了一个位置
<script> function sayHello(str){ alert(str) } </script> <script src="sayHello.js"></script>
此时页面就回弹出
JSONP其实就是模仿这个方法将调用传入的数据,前端设置方法接收
此时我们的sayHello.js如果传入的是参数
sayHello({ "info": [ { "id":1, "name": "小明", "age": 18, "sex": "男" }, { "id":2, "name": "小刚", "age": 15, "sex": "男" }, { "id":3, "name": "小红", "age": 14, "sex": "女" } ] })
如果使用JSONP跨域,一定和后端是约定俗称的数据格式,JSONP数据很不安全,除非信任数据来源,如果涉及到涉密信息,一定不能使用JOSNP,比如数据中有用户的手机号,身份证号码等等;
jQuery的JSONP的使用
jQuery帮我们封装好了JSONP请求
<body> <input type="button" value="点击发送请求" id="btn"> <script src="js/jquery.min.js"></script> <script > $("#btn").click(function(){ $.ajax("https://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/topnav/tupian@2x-482fc011fc.png",{ "dataType": "jsonp", //请求类型 "jsonpCallback": 'fetchJSON_comment98', //设置回调函数名称 "success": function(JSONdata) { console.log(JSONdata) } }) }) </script> </body>
jQuery封装的JSONP请求机理和我们自己写的请求机理是相同的
- 创建一个script标签,src是含有JSONP格式的跨域请求地址
- 定义了一个函数,函数名是JOSNP格式返回数据的固定名称,方法封装到了success中
- 删除script标签