PHP實(shí)現(xiàn)跨域的方式有哪些

PHP實(shí)現(xiàn)跨域的方式有哪些?這個(gè)問(wèn)題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見(jiàn)到的。希望通過(guò)這個(gè)問(wèn)題能讓你收獲頗深。下面是小編給大家?guī)?lái)的參考內(nèi)容,讓我們一起來(lái)看看吧!

創(chuàng)新互聯(lián)專(zhuān)注于利津網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供利津營(yíng)銷(xiāo)型網(wǎng)站建設(shè),利津網(wǎng)站制作、利津網(wǎng)頁(yè)設(shè)計(jì)、利津網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造利津網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供利津網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。

PHP實(shí)現(xiàn)跨域的幾種形式

1、JSONP(JSON with padding)原理

利用html里面script標(biāo)簽可以加載其他域下的js這一特性,使用script src的形式來(lái)獲取其他域下的數(shù)據(jù),但是,因?yàn)槭峭ㄟ^(guò)標(biāo)簽引入的,所以,會(huì)將請(qǐng)求到的JSON格式的數(shù)據(jù)作為js去運(yùn)行處理,顯然這樣運(yùn)行是不行的。

因此,就需要提前將返回的數(shù)據(jù)包裝一下,封裝成函數(shù)進(jìn)行運(yùn)行處理,函數(shù)名通過(guò)接口傳參的方式傳給后臺(tái),后臺(tái)解析到函數(shù)名后在原始數(shù)據(jù)上包裹這個(gè)函數(shù)名,發(fā)送給前端。(JSONP 需要對(duì)應(yīng)接口的后端的配合才能實(shí)現(xiàn))

實(shí)例:

<script>function showData(ret){
console.log(ret);
}</script><script src="http://api.jirengu.com/weather.php?callback=showData"></script>

當(dāng)script src請(qǐng)求到達(dá)后端后,后端會(huì)去解析callback這個(gè)參數(shù),獲取到字符串showData,在發(fā)送數(shù)據(jù)后端返回?cái)?shù)據(jù),用showData封裝一下,即showData({"json數(shù)據(jù)"}) ,前端script標(biāo)簽在加載數(shù)據(jù)后,會(huì)把json數(shù)據(jù)作為showData的參數(shù),調(diào)用函數(shù)運(yùn)行。

2、CORS

CORS全稱是跨域資源共享(Cross-Origin Resource Sharing),是一種 ajax 跨域請(qǐng)求資源的方式,支持現(xiàn)代瀏覽器,IE支持10以上。

實(shí)現(xiàn)方式:

當(dāng)使用XMLHttpRequest發(fā)送請(qǐng)求時(shí),瀏覽器發(fā)現(xiàn)該請(qǐng)求不符合同源策略,會(huì)給該請(qǐng)求加一個(gè)請(qǐng)求頭:Origin,后臺(tái)進(jìn)行一系列處理,如果確定接受請(qǐng)求,則在返回結(jié)果中加入一個(gè)響應(yīng)頭:Access-Control-Allow-Origin;瀏覽器判斷該相應(yīng)頭中,是否包含Origin的值,如果有,則瀏覽器會(huì)處理響應(yīng),我們就可以拿到響應(yīng)數(shù)據(jù),如果不包含,瀏覽器直接駁回,這時(shí),我們無(wú)法拿到響應(yīng)數(shù)據(jù)。

實(shí)例:

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日前瞻:中國(guó)沖擊4金 博爾特再戰(zhàn)200米羽球",
        "正直播柴飚/洪煒出戰(zhàn) 男雙力爭(zhēng)會(huì)師決賽",
        "女排將死磕巴西!郎平安排男陪練模仿對(duì)方核心"
        ]

      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('<h2>404 Not Found</h2>')
        }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

假設(shè)有兩個(gè)域名(主域域名不一致),其中iframe頁(yè)面是允許訪問(wèn)調(diào)用,那么就可以用postMessage實(shí)現(xiàn)。

原理:a域名發(fā)送請(qǐng)求postMessage,b域名間聽(tīng)到了message事件,就處理并返回?cái)?shù)據(jù)

//b域名<script>window.frames[0].postMessage(this.value, '*');
//*號(hào)表示在任何域下都可以接收message
window.addEventListener('message', function(e){
  console.log(e.data);
});</script>

感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)PHP實(shí)現(xiàn)跨域的方式有哪些大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章題目:PHP實(shí)現(xiàn)跨域的方式有哪些
文章源于:http://muchs.cn/article0/ihijoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、品牌網(wǎng)站制作、動(dòng)態(tài)網(wǎng)站、電子商務(wù)網(wǎng)站制作、

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化