JSONP实现跨域
前言
默认情况下,通过XHR实现ajax通信时会有一个限制,就是只能访问同一个域中的资源。同源策略是浏览器的一种安全策略,所谓同源是指,域名,协议,端口完全相同。
从我自己的网站访问别人网站的内容,就叫跨域。出于安全性考虑,浏览器不允许ajax跨域获取数据。
JSONP跨域
JSONP(JSON with padding,填充式JSON),本质是利用了 <script src=""></script>
标签具有可跨域的特性
实现步骤
- 定义一个获取数据后调用的回调函数
- 在
src
的url
后面加上callback
参数 - 服务器返回数据时把
json
数据包裹在callback
函数里面一起传给客户端
具体实现
利用script标签的src属性
客户端:
<script>
function fn(data) {
console.log("我被调用了呢!");
console.log(data);
}
</script>
<script src="http://127.0.0.1:8888/getData?callback=fn"></script>
服务器端:
服务器端使用了Nodejs和Express框架搭建了一个HTTP服务器。
const express = require("express");
const app = express();
app.listen(8888, () => {
console.log("server is running at http://127.0.0.1:8888/");
});
app.get("/getData", (req, res) => {
const fn = req.query.callback;
let arr = ["tom", "jerry", "spike"];
res.send(`fn(${JSON.stringify(arr)})`);
// console.log(...arr);
})
jQuery方式的JSONP
客户端:
<body>
<input id="btn" type="button" value="发起ajax请求">
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<script>
function fn(data) {
console.log("我被调用了呢!");
}
$(function() {
$("#btn").click(function() {
$.ajax({
url: "http://127.0.0.1:8888/getData",
type: "get",
dataType: "jsonp", //dataType必须定义为jsonp
jsonpCallback: "fn", //传递给服务器端的回调函数的名字
success: function(res) {
console.log("请求成功!");
console.log(res);
},
fail: function(err) {
console.log("请求失败:" + err);
}
});
});
});
</script>
</body>