查阅网上解决跨域的方式,主要有以下几种
1、使用jsonp方式
jsonp的原理就是利用<script>
标签没有跨域限制,通过<script>
标签src属性,发送带有callback参数的GET请求,服务端将接口返回数据拼凑到callback函数中,返回给浏览器,浏览器解析执行,从而前端拿到callback函数返回的数据。
1.1第一版:
后端,采用nginx字节返回固定对象
location /test1 {
default_type application/json;
return 200 '{"status":"success","result":"nginx json"}';
}
前端:写了一个简单的页面,引入jquery
<script type="text/javascript" src="D:\jquery.min.js"></script>
<script>
function getdata() {
$.ajax({
url : "http://10.20.65.161/test1",
type : "get",
dataType:"jsonp",
error : function(data) {
alert("失败:"+JSON.stringify(data));
},
success : function(data) {
alert("成功:"+JSON.stringify(data));
}
});
}
</script>
</head>
<body>
<button type="button" οnclick="getdata()">请求数据</button>
</body>
结果
结论: 能访问数据成功,但是回调永远进入的都是error函数。
1.2 第二版 前端增加jsonp和jsonpCallback属性
$.ajax({
url : "http://10.20.65.161/test1",
type : "get",
dataType:"jsonp",
jsonp:'callback',
jsonpCallback:"mycallback",//
error : function(data) {
alert("失败:"+JSON.stringify(data));
},
success : function(data) {
alert("成功:"+JSON.stringify(data));
}
});
增加了这2个属性以后,请求的url会变成:http://10.20.65.161/test1?callback=mycallback
后端可以取到callback的值,将返回内容封装成一个函数,具体如下
再测试:获得成功的结果,截图如下。
2.原生方式
function getdata1(){
var script = document.createElement('script');
script.type = 'text/javascript';
// 传参一个回调函数名给后端,方便后端返回时执行这个在前端定义的回调函数
script.src = 'http://10.20.65.161/test1?callback=handleCallback';
document.head.appendChild(script);
}
// 回调执行函数
function mycallback(res) {
alert(JSON.stringify(res));
}
附录:
参数解释:
jsonp
类型:String
在一个 jsonp 请求中重写回调函数的名字。这个值用来替代在 "callback=?" 这种 GET 或 POST 请求中 URL 参数里的 "callback" 部分,比如 {jsonp:'onJsonPLoad'} 会导致将 "onJsonPLoad=?" 传给服务器。
jsonpCallback
类型:String
为 jsonp 请求指定一个回调函数名。这个值将用来取代 jQuery 自动生成的随机函数名。这主要用来让 jQuery 生成度独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。你也可以在想让浏览器缓存 GET 请求的时候,指定这个回调函数名。
参考文章:
1、https://www.imooc.com/article/291931