跨域的解決方案(一):jsonp及其實現
標簽:
JavaScript
作者博客: martin
最近遇到了跨域问题,有很多种解决方案,本文主要对其中的jsonp进行演示,本文使用node编写服务器端代码进行测试。
jsonp的来历
jsonp的实现
从上文可知,jsonp的实现需要客户端代码和服务器端代码共同努力。整体的思路如下图:
Paste_Image.png
script标签不受跨域资源请求的影响,可以通过增加callback参数将回调函数传递,与服务器端配合从而在资源加载之后执行该回调函数,客户端关键部分写法如下:
<!DOCTYPE html><body>
<h1>测试jsonp</h1>
<p>用node搭建能够解析jsonp请求的服务器,前端通过script发送jsonp请求,通过回调处理服务器返回的数据</p>
<script>
function test(data){
alert(data.name);
}; </script>
<!-- 将test作为callback参数传递 -->
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="http://localhost:3000/jsonp?callback=test"></script></body>在服务器端,需要对script的src进行url解析,将data作为参数放入回调函数中,最后通过res.end(callback(data))中将要执行的函数放入客户端的script中,在客户端对该函数进行执行。
服务器端的关键代码如下:
//解析urlvar urlPath = url.parse(req.url).pathname;console.log(urlPath);//获取从客户端传递的参数var qs = querystring.parse(req.url.split('?')[1]);//约定的url的名称为jsonpif(urlPath === '/jsonp' && qs.callback){
res.writeHead(200,{'Content-Type':'application/json;charset=utf-8'}); var data = { "name": "Monkey"
};
data = JSON.stringify(data); var callback = qs.callback+'('+data+');'; //在end中返回callback(data),写入script中,进而客户端进行该函数的执行
res.end(callback);
}参考文章
作者:small_a
链接:https://www.jianshu.com/p/9d08d6ce1b60
點擊查看更多內容
1人點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
