PHP實現跨域的幾種形式
1、JSONP(JSON with padding)原理
利用html裡面script標籤可以載入其他域下的js這一特性,使用script src的形式來獲取其他域下的資料,但是,因為是通過標籤引入的,所以,會將請求到的JSON格式的資料作為js去執行處理,顯然這樣執行是不行的。
因此,就需要提前將返回的封包裝一下,封裝成函數進行執行處理,函數名通過介面傳參的方式傳給後台,後台解析到函數名後在原始資料上包裹這個函數名,傳送給前端。(JSONP 需要對應介面的後端的配合才能實現)
範例:
<script>function showData(ret){ console.log(ret); }</script><script src="http://api.jirengu.com/weather.php?callback=showData"></script>
當script src請求到達後端後,後端會去解析callback這個引數,獲取到字串showData,在傳送資料後端返回資料,用showData封裝一下,即showData({"json資料"}) ,前端script標籤在載入資料後,會把json資料作為showData的引數,呼叫函數執行。
2、CORS
CORS全稱是跨域資源共用(Cross-Origin Resource Sharing
),是一種 ajax 跨域請求資源的方式,支援現代瀏覽器,IE支援10以上。
實現方式:
當使用XMLHttpRequest
傳送請求時,瀏覽器發現該請求不符合同源策略,會給該請求加一個請求頭:Origin
,後台進行一系列處理,如果確定接受請求,則在返回結果中加入一個響應頭:Access-Control-Allow-Origin
;瀏覽器判斷該相應頭中,是否包含Origin的值,如果有,則瀏覽器會處理響應,我們就可以拿到響應資料,如果不包含,瀏覽器直接駁回,這時,我們無法拿到響應資料。
範例:
server.js
var http = require('http') var fs = require('fs') var path = require('path') var url = require('url')http.createServer(function(req, res){ var pathObj = url.parse(req.url, true) switch (pathObj.pathname) { case '/getNews': var news = [ "第11日前瞻:中國衝擊4金 博爾特再戰200米羽球", "正直播柴飈/洪煒出戰 男雙力爭會師決賽", "女排將死磕巴西!郎平安排男陪練模仿對方核心" ] res.setHeader('Access-Control-Allow-Origin','http://localhost:8080') //res.setHeader('Access-Control-Allow-Origin','*') res.end(JSON.stringify(news)) break; default: fs.readFile(path.join(__dirname, pathObj.pathname), function(e, data){ if(e){ res.writeHead(404, 'not found') res.end('<h1>404 Not Found</h1>') }else{ res.end(data) } }) }}).listen(8080)
index.html
<!DOCTYPE html><html><body> <div class="container"> <ul class="news"></ul> <button class="show">show news</button> </div><script> $('.show').addEventListener('click', function(){ var xhr = new XMLHttpRequest() xhr.open('GET', 'http://127.0.0.1:8080/getNews', true) xhr.send() xhr.onload = function(){ appendHtml(JSON.parse(xhr.responseText)) } }) function appendHtml(news){ var html = '' for( var i=0; i<news.length; i++){ html += '<li>' + news[i] + '</li>' } $('.news').innerHTML = html } function $(selector){ return document.querySelector(selector) } </script> </html>
3、postMessage
假設有兩個域名(主域域名不一致),其中iframe頁面是允許存取呼叫,那麼就可以用postMessage實現。
原理:a域名傳送請求postMessage,b域名間聽到了message事件,就處理並返回資料
//b域名<script>window.frames[0].postMessage(this.value, '*'); //*號表示在任何域下都可以接收message window.addEventListener('message', function(e){ console.log(e.data); });</script>
以上內容僅供參考!
推薦教學:PHP視訊教學
以上就是php跨域的幾種方式的詳細內容,更多請關注TW511.COM其它相關文章!