跨域

跨域的幾種方法

通過jsonp跨域

在js中澜倦,我們直接用XMLHttpRequest請求不同域上的數(shù)據(jù)時聚蝶,是不可以的。但是藻治,在頁面上引入不同域上的js腳本文件卻是可以的碘勉,jsonp正是利用這個特性來實現(xiàn)的。


  • 可以先這樣試試:
<script src="http://api.jirengu.com/weather.php"></script>

這時候會向天氣接口發(fā)送請求獲取數(shù)據(jù)栋艳,獲取數(shù)據(jù)后做為 js 來執(zhí)行。 但這里有個問題句各, 數(shù)據(jù)是 JSON 格式的數(shù)據(jù)吸占,直接作為 JS 運行的話我如何去得到這個數(shù)據(jù)來操作呢晴叨?

  • 這樣試試:
<script src="http://api.jirengu.com/weather.php?callback=showData"></script>
  • 這個請求到達(dá)后端后,后端會去解析callback這個參數(shù)獲取到字符串showData矾屯,在發(fā)送數(shù)據(jù)做如下處理:
    之前后端返回數(shù)據(jù): {"city": "hangzhou", "weather": "晴天"} 現(xiàn)在后端返回數(shù)據(jù): showData({"city": "hangzhou", "weather": "晴天"}) 前端script標(biāo)簽在加載數(shù)據(jù)后會把 「showData({“city”: “hangzhou”, “weather”: “晴天”})」做為 js 來執(zhí)行兼蕊,這實際上就是調(diào)用showData這個函數(shù),同時參數(shù)是 {“city”: “hangzhou”, “weather”: “晴天”}件蚕。 用戶只需要在加載提前在頁面定義好showData這個全局函數(shù)孙技,在函數(shù)內(nèi)部處理參數(shù)即可。
<script>
function showData(ret){
console.log(ret);
}
</script>
<script src="http://api.jirengu.com/weather.php?callback=showData"></script>

這就是 JSONP(JSON with padding)排作,總結(jié)一下:

JSONP是通過 script 標(biāo)簽加載數(shù)據(jù)的方式去獲取數(shù)據(jù)當(dāng)做 JS 代碼來執(zhí)行 提前在頁面上聲明一個函數(shù)牵啦,函數(shù)名通過接口傳參的方式傳給后臺,后臺解析到函數(shù)名后在原始數(shù)據(jù)上「包裹」這個函數(shù)名妄痪,發(fā)送給前端哈雏。換句話說,JSONP 需要對應(yīng)接口的后端的配合才能實現(xiàn)衫生。

  • 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金 博爾特再戰(zhàn)200米羽球",
        "正直播柴飚/洪煒出戰(zhàn) 男雙力爭會師決賽",
        "女排將死磕巴西裳瘪!郎平安排男陪練模仿對方核心"
      ]
      res.setHeader('Content-Type', 'text/json; charset=utf-8')
      if (pathObj.query.callback) {
        res.end(pathObj.query.callback + '(' + JSON.stringify(news) + ')')
      } else {
        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 script = document.createElement('script');
      script.src = 'http://127.0.0.1:8080/getNews?callback=appendHtml';
      document.head.appendChild(script);
      document.head.removeChild(script);
    })

    function appendHtml(news) {
      var html = '';
      for (var i = 0; i < news.length; i++) {
        html += '<li>' + news[i] + '</li>';
      }
      console.log(html);
      $('.news').innerHTML = html;
    }

    function $(id) {
      return document.querySelector(id);
    }
  </script>

</html>
打開終端,輸入 node server.js 罪针,瀏覽器打開 http://localhost:8080/index.html

CORS

CORS 全稱是跨域資源共享(Cross-Origin Resource Sharing)彭羹,是一種 ajax 跨域請求資源的方式,支持現(xiàn)代瀏覽器泪酱,IE支持10以上派殷。 實現(xiàn)方式很簡單,當(dāng)你使用 XMLHttpRequest 發(fā)送請求時西篓,瀏覽器發(fā)現(xiàn)該請求不符合同源策略愈腾,會給該請求加一個請求頭:Origin,后臺進(jìn)行一系列處理岂津,如果確定接受請求則在返回結(jié)果中加入一個響應(yīng)頭:Access-Control-Allow-Origin; 瀏覽器判斷該相應(yīng)頭中是否包含 Origin 的值虱黄,如果有則瀏覽器會處理響應(yīng),我們就可以拿到響應(yīng)數(shù)據(jù)吮成,如果不包含瀏覽器直接駁回橱乱,這時我們無法拿到響應(yīng)數(shù)據(jù)。所以 CORS 的表象是讓你覺得它與同源的 ajax 請求沒啥區(qū)別粱甫,代碼完全一樣泳叠。
  • 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金 博爾特再戰(zhàn)200米羽球",
        "正直播柴飚/洪煒出戰(zhàn) 男雙力爭會師決賽",
        "女排將死磕巴西!郎平安排男陪練模仿對方核心"
      ]

      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)
區(qū)別在于訪問控制與允許的域,交給瀏覽器作判斷.
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080')
允許任何人獲得數(shù)據(jù)
res.setHeader('Access-Control-Allow-Origin','*')
  • 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>
啟動終端茶宵,執(zhí)行 node server.js 危纫,瀏覽器打開 http://localhost:8080/index.html ,查看效果和網(wǎng)絡(luò)請求

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子种蝶,更是在濱河造成了極大的恐慌契耿,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螃征,死亡現(xiàn)場離奇詭異搪桂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盯滚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門踢械,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人魄藕,你說我怎么就攤上這事内列。” “怎么了泼疑?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵德绿,是天一觀的道長。 經(jīng)常有香客問我退渗,道長移稳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任会油,我火速辦了婚禮个粱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翻翩。我一直安慰自己都许,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布嫂冻。 她就那樣靜靜地躺著胶征,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桨仿。 梳的紋絲不亂的頭發(fā)上睛低,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音服傍,去河邊找鬼钱雷。 笑死,一個胖子當(dāng)著我的面吹牛吹零,可吹牛的內(nèi)容都是我干的罩抗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼灿椅,長吁一口氣:“原來是場噩夢啊……” “哼套蒂!你這毒婦竟也來了钞支?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤操刀,失蹤者是張志新(化名)和其女友劉穎伸辟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馍刮,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年窃蹋,在試婚紗的時候發(fā)現(xiàn)自己被綠了卡啰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡警没,死狀恐怖匈辱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杀迹,我是刑警寧澤亡脸,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站树酪,受9級特大地震影響浅碾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜续语,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一垂谢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疮茄,春花似錦滥朱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至畸裳,卻和暖如春缰犁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躯畴。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工民鼓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蓬抄。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓丰嘉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親嚷缭。 傳聞我的和親對象是個殘疾皇子饮亏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 參考:瀏覽器的同源策略瀏覽器同源政策及其規(guī)避方法同源政策 什么是同源策略耍贾? 同源策略限制了從同一個源加載的文檔或腳...
    DHFE閱讀 533評論 0 0
  • 1:什么是同源策略 瀏覽器出于安全及用戶隱私方面的考慮,只允許腳本與本域下的接口交互路幸。不同源的客戶端腳本在沒有明確...
    饑人谷_bigJiao閱讀 248評論 0 1
  • 同源策略(Same origin Policy) 瀏覽器出于安全方面的考慮荐开,只允許與本域下的接口交互。不同源的客戶...
    凜冬已至_123閱讀 165評論 0 1
  • 1.同源策略(Same origin Policy) 瀏覽器出于安全方面的考慮简肴,只允許與本域下的接口交互晃听。不同源的...
    好奇男孩閱讀 328評論 0 2
  • 題目1.什么是同源策略? 同源策略(Same origin Policy): 瀏覽器出于安全方面的考慮,只允許與本...
    FLYSASA閱讀 1,708評論 0 6