跨域案例下载:https://sdeno.com/?p=4815
先看下jsonp原理

例子:
http://www.weather.com.cn/data/cityinfo/101200101.html
天气预报提供对外接口,供各大网站获取其数据,属于跨域问题。
由于提供的接口本身没有回调函数只是简单的一段字符串,我们不能直接使用前端技术获取到数据,所以要配合php将接口进行简单的处理。
1,服务器设置

<?php
header("content-type: text/html");
$url = 'http://www.weather.com.cn/data/cityinfo/101200101.html'; //接口没有提供回调函数所以只能自己写回调
$data = file_get_contents($url);
$str='nini'.'('.$data.')'; //将数据放入到函数值中
//或者 $str=$_POST['wowo'].'('.$data.')';
echo $str;
?>
2,前端设置
$.ajax({
type:'post', //不声明默认是get
url:'http://127.0.0.1/2.php', //需要跨域请求的地址
dataType:"jsonp", //必须是jsonp 才有回调函数返回
jsonp:"wowo", //自定义回调函数名,如果没定义默认名为 callback
jsonpCallback:"nini", //自定义回调函数值,如果没有定义将会是随机生成
error: function(){
alert("ERROR!")
},
success: function(msg){
alert(msg.weatherinfo.city);
}
});
返回来的msg参数就是封装好的接口对象,这样就能实现跨域访问到其他网站的数据。
—————————————-js jquery 跨域 推荐看以下部分——————————————————–
以下环境讲解,是在跨域情况下
客户端:
$('button').click(function(){
$.ajax({
type:'POST', //虽然设置了post,跨域时候服务器端才是以get方式接收
url:"http://localhost/server.php", //虽然存在跨域,服务器端还是能接受到客户端发送来的数据,但是客户端接受不到服务器端返回的数据,被浏览器挡住了
data:{user:'root',pass:'187'}, //这里是客户端要发送给服务器的数据,也就是服务器要接受的数据,这些数据不管存不存在跨域情况,服务器都能接受的到用$_GET[]方式接受
dataType:"jsonp", //跨域接受服务器返回的数据,必须是jsonp类型才行
cache:false,
// jsonp:"wowo", //如果这两项没有设置,默认发送给服务器地址是:server.php?callback=jQuery18302435384537538523_1476780843978&user=root&pass=187
// jsonpCallback:"nini", //如果设置了发送给服务器的请求是:server.php?wowo=nini&user=root&pass=187
//以上两项设置其中一项就行了,如果设置了jsonp:"wowo",服务器就用$_GET['wowo']([{},{}])来接收;设置了jsonpCallback,直接就 nini([{},{}])
success: function(data){
alert('能获取服务器返回的信息,跨域成功'); //这里的回调触发,只有客户端成功接受到了data,就是url返回的数据才能发出到。
}
});
return false;
});
服务器端:
header('Content-Type: text/html; charset=utf-8');
$con=mysqli_connect('localhost', 'root', '', 'test2');
mysqli_query($con, "insert into liuyan_user(liuyan_username,liuyan_userpass) values ('".$_GET['user']."','".$_GET['pass']."')"); //跨域时,数据发送给服务器都是以get方式发送的
$data='[{name:"chenge"},{age:24}]'; //这里就是要返回给客户端的数据,必须还是json格式的,不然就出错。之前设置了也必须设置dataType:"jsonp"
$str=$_GET['wowo'].'('.$data.')';
//这里其实就是 'jQuery18302435384537538523_1476780843978([{name:"chenge"},{age:24}])' ,直接把这个结果输出,客户端就能接收到了,因为jquery已经封装好了。
//如果设置了jsonpCallback:"nini",直接就 'nini([{name:"chenge"},{age:24}])'
echo $str; //'jQuery18302435384537538523_1476780843978([{name:"chenge"},{age:24}])'
以上方法,貌似只能支持谷歌、火狐。遇到IE就完全不能兼容了。但是IE8、9有专门插件兼容。
推荐查看https://sdeno.com/?p=6218 ,兼容ie6/7/8浏览器。
约束:
1. 使用 $.ajax 发送请求,jQuery 版本需在 1.5+
2. 服务端需设置 header:header(‘Access-Control-Allow-Origin:*’);
3. 请求方式仅限:GET / POST
4. 协议仅限:HTTP / HTTPS,且必须相同
5. 仅限异步请求
客服端:
// GET $.getJSON('http://jsonmoon.jsapp.us/').done(function(data) { console.log(data.name.first); }); // POST $.ajax({ url: 'http://frozen-woodland-5503.herokuapp.com/cors.json', data: 'this is data being posted to the server', contentType: 'text/plain', type: 'POST', dataType: 'json' }).done(function(data) { console.log(data.name.last); });
服务器端:
<?php
header('Access-Control-Allow-Origin:*');
echo '[{"name":"123"}]'; //注意标点符号都要正确
?>
第二种跨域方法是修改header表头信息参考:《推荐看php header 跨域》
nodejs 跨域表头信息修改如:
//服务器 修改如下
//客服端url接收/cors地址
app.post('/cors', function(req, res) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1')
res.header("Content-Type", "application/json;charset=utf-8");
var data = {
name: req.body.name + ' - server 3001 cors process',
id: req.body.id + ' - server 3001 cors process'
}
console.log(data)
res.send(data)
res.end()
})