常見的幾種跨域方法

1.CORS方式實現(xiàn)跨域羔飞。

CORS需要瀏覽器和服務器同時支持。目前拓颓,所有瀏覽器都支持該功能,IE瀏覽器不能低于IE10孕惜。
整個CORS通信過程,都是瀏覽器自動完成晨炕,不需要用戶參與衫画。對于開發(fā)者來說,CORS通信與同源的AJAX通信沒有差別瓮栗,代碼完全一樣削罩。瀏覽器一旦發(fā)現(xiàn)AJAX請求跨源,就會自動添加一些附加的頭信息费奸,有時還會多出一次附加的請求弥激,但用戶不會有感覺。
因此愿阐,實現(xiàn)CORS通信的關鍵是服務器微服。只要服務器實現(xiàn)了CORS接口,就可以跨源通信缨历。

<div>
    <ul class="content"></ul>
  </div>
  <div class="btn">
    <button>獲取天氣</button>
  </div>
  <script>
    function $(e) {
      return document.querySelectorAll(e)
    }
    $('.btn button')[0].addEventListener('click', function () {
      var xhr = new XMLHttpRequest()
      xhr.open('get', 'http://b.jrg.com:8080/getNews', true)
      xhr.send()
      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
          if (xhr.status === 200) {
            console.log(xhr.responseText)
            doSomething(JSON.parse(xhr.responseText))
          }
        }
      }
    })
    function doSomething(str) {
      var fragment = document.createDocumentFragment()
      for (var i = 0; i < str.length; i++) {
        var li = document.createElement('li')
        fragment.appendChild(li)
        li.innerText = str[i]
      }
      $('.content')[0].appendChild(fragment)
    }
  </script>
var http = require('http')
var fs = require('fs')
var path = require('path')
var url = require('url')

var server = http.createServer(function(req,res){
    var news = [
      '你在的哈佛撒酒瘋第三輪卡發(fā)動機撒大豐收的高發(fā)地告訴對方感到十分',
      '今天也un寡鳧單鵠個地方經(jīng)濟掛號費的話的好過分的話換個地方換個地方',
      '國風塑try投入猶太人一頭熱一頭熱英特爾亞特亞特英特爾亞特日',
      '進口庫伊uytiupsdgfdsytyeryreyterytrgfdgfdsgdfsgfdshgfshgfh',
      '今天也un寡鳧單鵠個地方經(jīng)濟掛號費的話的好過分的話換個地方換個地方',
      '各方當事公司范德薩各方當事官方上各方當事官方是高仿時光飛逝桂豐大廈官方'
    ]
    var data = []
    for (var i = 0; i < 3; i++) {
      var index = parseInt(Math.random()*news.length)
      data.push(news[index]);
      news.splice(index,1)
    }
    res.setHeader('Access-Control-Allow-Origin','http://a.jrg.com:8080')
    var pathObj = url.parse(req.url,true)
    console.log(pathObj.pathname)
    switch(pathObj.pathname) {
      case '/getNews':
      res.end(JSON.stringify(data))
      break;
      default:
      fs.readFile(__dirname + pathObj.pathname,'binary',function(e,content) {
        if(e) {
          res.setHeader('404','not found')
          res.end('404 not found')
        } else {
          res.end(content,'binary')
        }
      })
    }
})
server.listen(8080)
console.log('監(jiān)聽成功以蕴,打開這個地址'JSONP)

2. JSONP方式實現(xiàn)跨域

  • JSONP是服務器與客戶端跨源通信的常用方法。最大特點就是簡單適用辛孵,老式瀏覽器全部支持丛肮,服務器改造非常小。
    它的基本思想是魄缚,網(wǎng)頁通過添加一個<script>元素宝与,向服務器請求JSON數(shù)據(jù),這種做法不受同源政策限制冶匹;服務器收到請求后习劫,將數(shù)據(jù)放在一個指定名字的回調(diào)函數(shù)里傳回來。
<div>
    <ul class="content"></ul>
  </div>
  <div class="btn">
    <button>獲取天氣</button>
  </div>
  <script>
    var btn = document.querySelectorAll('.btn button')[0]
    var ul = document.querySelectorAll('.content')[0]
    btn.addEventListener('click', function () {
      var script = document.createElement('script')
      script.src = '//a.jrg.com/getNews?callback=appendHtml'
      document.head.appendChild(script)
    })

    function appendHtml(str) {
      var html = '';
      for (var i = 0; i < str.length; i++) {
        html += '<li>' + str[i] + '</li>'   
      }
      ul.innerHTML = html
    }
  </script>
var http = require('http')
var fs = require('fs')
var path = require('path')
var url = require('url')

var server = http.createServer(function (req, res) {
  var news = [
    '你在的哈佛撒酒瘋第三輪卡發(fā)動機撒大豐收的高發(fā)地告訴對方感到十分',
    '今天也un寡鳧單鵠個地方經(jīng)濟掛號費的話的好過分的話換個地方換個地方',
    '國風塑try投入猶太人一頭熱一頭熱英特爾亞特亞特英特爾亞特日',
    '進口庫伊uytiupsdgfdsytyeryreyterytrgfdgfdsgdfsgfdshgfshgfh',
    '今天也un寡鳧單鵠個地方經(jīng)濟掛號費的話的好過分的話換個地方換個地方',
    '各方當事公司范德薩各方當事官方上各方當事官方是高仿時光飛逝桂豐大廈官方'
  ]
  var data = []
  for (var i = 0; i < 3; i++) {
    var index = parseInt(Math.random() * news.length)
    data.push(news[index]);
    news.splice(index, 1)
  }

  var pathObj = url.parse(req.url, true)
  switch (pathObj.pathname) {
    case '/getNews':
      res.setHeader('Content-Type', 'text/json,charset="utf-8')
      console.log(pathObj.query.callback)
      if (pathObj.query.callback) {
        res.end(pathObj.query.callback + '(' + JSON.stringify(data) + ')')
      } else {
        res.end(JSON.stringify(data))
      }
      break;
    default:
      fs.readFile(__dirname + pathObj.pathname, 'binary', function (e, content) {
        if (e) {
          res.setHeader('404', 'not found')
          res.end('404 not found')
        } else {
          res.end(content, 'binary')
        }
      })
  }
})
server.listen(80)
console.log('監(jiān)聽成功徙硅,打開這個地址')

3. 降域

  • 在兩個父子連個頁面的script標簽里面添加document.domain= '相同的一級域名'榜聂;
 <h1>使用降域?qū)崿F(xiàn)跨域</h1>
  <div class="main">
    <input type="text" placeholder="http://a.jrg.com/a.html">
  </div>
  <iframe src="http://b.jrg.com/b.html" frameborder="1"></iframe>
  <script>
    document.querySelector('.main input').addEventListener('input',function() {
      window.frames[0].document.querySelector('input').value = this.value
    })
  document.domain = 'jrg.com'
  </script>
 <div class="ct">
    <input type="text" placeholder="http://b.jrg.com/b.html">
  </div>
  <script>
    document.querySelector('input').addEventListener('input',function() {
      window.parent.document.querySelector('input').value = this.value
    })
    document.domain = 'jrg.com'
  </script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嗓蘑,隨后出現(xiàn)的幾起案子须肆,更是在濱河造成了極大的恐慌,老刑警劉巖桩皿,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豌汇,死亡現(xiàn)場離奇詭異,居然都是意外死亡泄隔,警方通過查閱死者的電腦和手機拒贱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逻澳,你說我怎么就攤上這事闸天。” “怎么了斜做?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵苞氮,是天一觀的道長。 經(jīng)常有香客問我瓤逼,道長笼吟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任霸旗,我火速辦了婚禮贷帮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诱告。我一直安慰自己撵枢,他們只是感情好,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布蔬啡。 她就那樣靜靜地躺著诲侮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪箱蟆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天刮便,我揣著相機與錄音空猜,去河邊找鬼。 笑死恨旱,一個胖子當著我的面吹牛辈毯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搜贤,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谆沃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仪芒?” 一聲冷哼從身側(cè)響起唁影,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掂名,沒想到半個月后据沈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡饺蔑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年锌介,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡孔祸,死狀恐怖隆敢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崔慧,我是刑警寧澤筑公,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站尊浪,受9級特大地震影響匣屡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拇涤,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一捣作、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹅士,春花似錦券躁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趾痘,卻和暖如春慢哈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背永票。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工卵贱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侣集。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓键俱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親世分。 傳聞我的和親對象是個殘疾皇子编振,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

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

  • 1. AJAX AJAX(Asynchronous JavaScript and XML),意思就是用JavaSc...
    公子七閱讀 4,989評論 0 5
  • 跨域是什么 同源策略 在講解什么是跨域之前先要清楚什么是同源策略臭埋,“同源政策”(same-origin polic...
    JRG_Orange閱讀 953評論 0 52
  • 一踪央、瀏覽器的同源策略 1.什么是同源? 所謂“同源”指的是”三個相同“斋泄。相同的域名杯瞻、端口和協(xié)議,這三個相同的話就視...
    徐國軍_plus閱讀 834評論 1 3
  • jsonp 原理:JSONP 利用 元素的這個開放策略炫掐,網(wǎng)頁可以得到從其他來源動態(tài)產(chǎn)生的JSON數(shù)據(jù)魁莉,而這種使用...
    _士心_閱讀 407評論 0 6
  • 心里面好像有個閥門會泄露,總是在一點一點滴答滴答的漏著些難過,等到可以漫過腳踝的時候旗唁,我才會發(fā)現(xiàn)畦浓,用心地把它們都處...
    下雨天嘩啦啦閱讀 131評論 0 0