婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 詳解ajax跨域問題解決方案

詳解ajax跨域問題解決方案

熱門標(biāo)簽:怎樣在地圖標(biāo)注文字 河間市地圖標(biāo)注app 地圖標(biāo)注推銷坑人 大眾點(diǎn)評(píng)400電話怎么申請(qǐng) 立陶宛地圖標(biāo)注 上海企業(yè)外呼系統(tǒng)價(jià)錢 東平縣地圖標(biāo)注app 中國(guó)地圖標(biāo)注不明確情況介紹表 電銷機(jī)器人 長(zhǎng)春

今天來記錄一下關(guān)于ajax跨域的一些問題。以備不時(shí)之需。

跨域

同源策略限制

同源策略阻止從一個(gè)域上加載的腳本獲取或操作另一個(gè)域上的文檔屬性。也就是說,受到請(qǐng)求的 URL 的域必須與當(dāng)前 Web 頁(yè)面的域相同。這意味著瀏覽器隔離來自不同源的內(nèi)容,以防止它們之間的操作。

解決方式

通常來說,比較通用的有如下兩種方式,一種是從服務(wù)器端下手,另一種則是從客戶端的角度出發(fā)。二者各有利弊,具體要使用哪種方式還需要具體的分析。

  1. 服務(wù)器設(shè)置響應(yīng)頭
  2. 服務(wù)器代理
  3. 客戶端采用腳本回調(diào)機(jī)制。

方式一

Access-Control-Allow-Origin 關(guān)鍵字只有在服務(wù)器端進(jìn)行設(shè)置才
會(huì)生效。也就是說即使再客戶端使用

xmlhttprequest.setHeaderREquest('xx','xx');

也不會(huì)有什么效果。

正常ajax請(qǐng)求

下面來模擬一下ajax非跨域請(qǐng)求的案例實(shí)現(xiàn)。

test1.html

!DOCTYPE html>
html lang="en">
head>
 meta charset="UTF-8">
 title>ajax 測(cè)試/title>
/head>
body>

input type="button" value="Test" onclick="crossDomainRequest()">
div id="content">/div>
script>
 var xhr = new XMLHttpRequest();
 var url = 'http://localhost/learn/ajax/test1.php';

 function crossDomainRequest() {
  document.getElementById('content').innerHTML = "font color='red'>loading.../font>";
  // 延遲執(zhí)行
  setTimeout(function () {
   if (xhr) {
    xhr.open('GEt', url, true);
    xhr.onreadystatechange = handle_response;
    xhr.send(null);
   } else {
    document.getElementById('content').innerText = "不能創(chuàng)建XMLHttpRequest對(duì)象";
   }
  }, 3000);
 }

 function handle_response() {
  var container = document.getElementById('content');
  if (xhr.readyState == 4) {
   if (xhr.status == 200 || xhr.status == 304) {
    container.innerHTML = xhr.responseText;
   } else {
    container.innerText = '不能跨域請(qǐng)求';
   }
  }
 }
/script>

/body>
/html>

同級(jí)目錄下的test1.PHP內(nèi)容如下:

?php

echo "It Works.";

?>

跨域請(qǐng)求

剛才是HTML文件和php文件都在Apache的容器下,所以沒有出現(xiàn)跨域的情形,現(xiàn)在把HTML文件放到桌面上,這樣再次請(qǐng)求PHP數(shù)據(jù)的話,就營(yíng)造了這樣一個(gè)“跨域請(qǐng)求”了。

注意看瀏覽器的地址欄信息

再次進(jìn)行訪問,發(fā)現(xiàn)會(huì)出現(xiàn)下面的錯(cuò)誤信息。

針對(duì)這種情況,比較常見的一個(gè)操作就是設(shè)置Access-Control-Allow-Origin。

格式: Access-Control-Allow-Origin: domain.com/xx/yy.*

如果知道客戶端的域名或者請(qǐng)求的固定路徑,則最好是不使用通配符的方式,來進(jìn)一步保證安全性。如果不確定,那就是用*通配符好了。

后端開發(fā)語言為PHP的時(shí)候可以再文件開始處這么設(shè)置:

header("Access-Control-Allow-Origin: *");

如果是ASPX頁(yè)面的話,要這么設(shè)置(Java與之類似):

Response.AddHeader("Access-Control-Allow-Origin", "*");

這時(shí),再次來訪問一下剛才的路徑。

服務(wù)器代理模式

這種方式應(yīng)該算是比較常用的,而且被廣泛采納的一個(gè)方式了。說代理有點(diǎn)太過于書面化了,其實(shí)就是傳話兒的。來舉個(gè)小例子:

小明喜歡三班一個(gè)叫小紅的女孩兒,但是不好意思去要人家的QQ,微信號(hào)。然后就托和自己班的女生–小蘭。來幫自己去要。所以小蘭就相當(dāng)于一個(gè)代理。幫助小明獲取原本不能直接獲取的小紅的聯(lián)系方式。

下面來舉個(gè)例子說明這個(gè)問題。

直接的跨域請(qǐng)求

修改一下剛才的URL即可,讓ajax直接去請(qǐng)求其他網(wǎng)站的數(shù)據(jù)。

!DOCTYPE html>
html lang="en">
head>
 meta charset="UTF-8">
 title>ajax 測(cè)試/title>
/head>
body>

input type="button" value="Test" onclick="crossDomainRequest()">
div id="content">/div>
script>
 var xhr = new XMLHttpRequest();
// var url = 'http://localhost/learn/ajax/test1.php';
  var url = 'http://api.qingyunke.com/api.php?key=freeappid=0msg=%E5%93%92%E5%93%92';
 function crossDomainRequest() {
  document.getElementById('content').innerHTML = "font color='red'>loading.../font>";
  // 延遲執(zhí)行
  setTimeout(function () {
   if (xhr) {
    xhr.open('GEt', url, true);
    xhr.onreadystatechange = handle_response;
    xhr.send(null);
   } else {
    document.getElementById('content').innerText = "不能創(chuàng)建XMLHttpRequest對(duì)象";
   }
  }, 3000);
 }

 function handle_response() {
  var container = document.getElementById('content');
  if (xhr.readyState == 4) {
   if (xhr.status == 200 || xhr.status == 304) {
    container.innerHTML = xhr.responseText;
   } else {
    container.innerText = '不能跨域請(qǐng)求';
   }
  }
 }
/script>

/body>
/html>

結(jié)果如下:

啟用代理模式

剛才的HTML頁(yè)面,咱們還是用自己的接口:

url = 'http://localhost/learn/ajax/test1.php';

具體如下:

!DOCTYPE html>
html lang="en">
head>
 meta charset="UTF-8">
 title>ajax 測(cè)試/title>
/head>
body>

input type="button" value="Test" onclick="crossDomainRequest()">
div id="content">/div>
script>
 var xhr = new XMLHttpRequest();
 var url = 'http://localhost/learn/ajax/test1.php';
//  var url = 'http://api.qingyunke.com/api.php?key=freeappid=0msg=%E5%93%92%E5%93%92';
 function crossDomainRequest() {
  document.getElementById('content').innerHTML = "font color='red'>loading.../font>";
  // 延遲執(zhí)行
  setTimeout(function () {
   if (xhr) {
    xhr.open('GEt', url, true);
    xhr.onreadystatechange = handle_response;
    xhr.send(null);
   } else {
    document.getElementById('content').innerText = "不能創(chuàng)建XMLHttpRequest對(duì)象";
   }
  }, 3000);
 }

 function handle_response() {
  var container = document.getElementById('content');
  if (xhr.readyState == 4) {
   if (xhr.status == 200 || xhr.status == 304) {
    container.innerHTML = xhr.responseText;
   } else {
    container.innerText = '不能跨域請(qǐng)求';
   }
  }
 }
/script>

/body>
/html>

然后對(duì)應(yīng)的test1.php應(yīng)該幫助我們實(shí)現(xiàn)數(shù)據(jù)請(qǐng)求這個(gè)過程,把“小紅的聯(lián)系方式”要到手,并返回給“小明”。

?php

$url = 'http://api.qingyunke.com/api.php?key=freeappid=0msg=hello%20world.';
$result = file_get_contents($url);
echo $result;

?>

下面看下代碼執(zhí)行的結(jié)果。

jsonp方式

JSONP(JSON with Padding) 靈感其實(shí)源于在HTML頁(yè)面中script標(biāo)簽內(nèi)容的加載,對(duì)于script的src屬性對(duì)應(yīng)的內(nèi)容,瀏覽器總是會(huì)對(duì)其進(jìn)行加載。于是:

克服該限制更理想方法是在 Web 頁(yè)面中插入動(dòng)態(tài)腳本元素,該頁(yè)面源指向其他域中的服務(wù) URL 并且在自身腳本中獲取數(shù)據(jù)。腳本加載時(shí)它開始執(zhí)行。該方法是可行的,因?yàn)橥床呗圆蛔柚箘?dòng)態(tài)腳本插入,并且將腳本看作是從提供 Web 頁(yè)面的域上加載的。但如果該腳本嘗試從另一個(gè)域上加載文檔,就不會(huì)成功。

實(shí)現(xiàn)的思路就是:

在服務(wù)器端組裝出客戶端預(yù)置好的json數(shù)據(jù),通過回調(diào)的方式傳回給客戶端。

原生實(shí)現(xiàn)

!DOCTYPE html>
html lang="en">
head>
 meta charset="UTF-8">
 title>ajax 測(cè)試/title>
 script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.8.0.js" type="text/javascript">/script>
/head>
body>
input type="text" name="talk" id="talk">
input type="button" value="Test" id="btn">
div id="content">/div>
script type="text/javascript">

function jsonpcallback(result) {
 for(var i in result) {
  alert(i+":"+result[i]);
 }
 }
 var JSONP = document.createElement("script");
 JSONP.type='text/javascript';
 JSONP.src='http://localhost/learn/ajax/test1.php?callback=jsonpcallback';
 document.getElementsByTagName('head')[0].appendChild(JSONP);


/script>

/body>
/html>

服務(wù)器端test1.php內(nèi)容如下:

?php

$arr = [1,2,3,4,5,6];
$result = json_encode($arr);
echo "jsonpcallback(".$result.")";

?>

需要注意的是最后組裝的返回值內(nèi)容。

來看下最終的代碼執(zhí)行效果。

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

采用原生的JavaScript需要處理的事情還是蠻多的,下面為了簡(jiǎn)化操作,決定采用jQuery來代替一下。

!DOCTYPE html>
html lang="en">
head>
 meta charset="UTF-8">
 title>ajax 測(cè)試/title>
 script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.8.0.js" type="text/javascript">/script>
/head>
body>
input type="text" name="talk" id="talk">
input type="button" value="Test" id="btn">
div id="content">/div>

script type="text/javascript">

 function later_action(msg) {
  var element = $("div>font color='green'>"+msg+"/font>br />/div>");
  $("#content").append(element);
 }

 $("#btn").click(function(){
  // alert($("#talk").val());
  $.ajax({
  url: 'http://localhost/learn/ajax/test1.php',
  method: 'post',
  dataType: 'jsonp',
  data: {"talk": $("#talk").val()},
  jsonp: 'callback',
  success: function(callback){
   console.log(callback.content);
   later_action(callback.content);
  },
  error: function(err){
   console.log(JSON.stringify(err));

  },
 });
 });
/script>

/body>
/html>

相應(yīng)的,test1.php為了配合客戶端聊天的需求,也稍微做了點(diǎn)改變。

?php
$requestparam = isset($_GET['callback'])?$_GET['callback']:'callback';

// 青云志聊天機(jī)器人接口: http://api.qingyunke.com/api.php?key=freeappid=0msg=hello
// 接收來自客戶端的請(qǐng)求內(nèi)容
$talk = $_REQUEST['talk'];
$result = file_get_contents("http://api.qingyunke.com/api.php?key=freeappid=0msg=$talk");

// 拼接一些字符串
echo $requestparam . "($result)";

?>

最后來查看一下跨域的效果吧。

總結(jié)

至此,關(guān)于簡(jiǎn)單的ajax跨域問題,就算是解決的差不多了。對(duì)我個(gè)人而言,對(duì)于這三種方式有一點(diǎn)點(diǎn)自己的看法。

  1. 服務(wù)器設(shè)置Access-Control-Allow-Origin的方式適合信用度高的小型應(yīng)用或者個(gè)人應(yīng)用。
  2. 代理模式則比較適合大型應(yīng)用的處理。但是需要一個(gè)統(tǒng)一的規(guī)范,這樣管理和維護(hù)起來都會(huì)比較方便。
  3. JSONP方式感覺還是比較雞肋的(有可能是我經(jīng)驗(yàn)還不足,沒認(rèn)識(shí)到這個(gè)方式的優(yōu)點(diǎn)吧(⊙﹏⊙)b)。自己玩玩知道有這么個(gè)東西好了。維護(hù)起來實(shí)在是優(yōu)點(diǎn)麻煩。

參考鏈接:

Ajax跨域請(qǐng)求: https://www.jb51.net/article/72703.htm

服務(wù)器端跨域設(shè)置: https://www.jb51.net/article/104442.htm

Ajax高級(jí)筆記: https://www.jb51.net/article/116878.htm

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 關(guān)于Ajax跨域問題及解決方案詳析
  • Ajax跨域問題及解決方案(jsonp,cors)
  • 解決前端跨域問題方案匯總
  • ajax請(qǐng)求前端跨域問題原因及解決方案

標(biāo)簽:本溪 益陽 玉樹 遼寧 四川 內(nèi)江 銅川 營(yíng)口

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《詳解ajax跨域問題解決方案》,本文關(guān)鍵詞  詳解,ajax,跨域,問題,解決方案,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解ajax跨域問題解決方案》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于詳解ajax跨域問題解決方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产成人三级在线观看| 欧美成人女星排行榜| 久久99国产精品尤物| 免费在线看一区| 美女一区二区三区| 久久精品国产成人一区二区三区| 成人免费高清在线| 国产在线精品视频| 国产精品99久久久久| 国产精品亚洲一区二区三区在线| 国产白丝精品91爽爽久久| 成人免费看视频| 99久久99久久久精品齐齐| 色综合久久综合网欧美综合网| 91浏览器在线视频| 欧美日韩中文另类| 精品久久五月天| 国产亚洲污的网站| 中文字幕av不卡| 亚洲一区二区五区| 另类人妖一区二区av| 成人手机电影网| 欧美日韩欧美一区二区| 久久网站热最新地址| 中文字幕一区在线观看| 亚洲va中文字幕| 国产一区不卡视频| 在线观看日韩国产| 久久午夜羞羞影院免费观看| 亚洲欧美经典视频| 裸体一区二区三区| 色综合色狠狠天天综合色| 日韩一区二区影院| 亚洲日韩欧美一区二区在线| 亚洲成人高清在线| 成人免费高清在线观看| 日韩视频免费观看高清完整版在线观看| 精品免费99久久| 一区二区三区在线视频观看58| 精品在线一区二区| 一本在线高清不卡dvd| 欧美精品一区二区三区一线天视频| 综合久久久久久久| 国产一区二区三区高清播放| 欧美少妇一区二区| 国产欧美在线观看一区| 蜜桃av一区二区| 在线免费不卡电影| 久久影视一区二区| 免费的成人av| 欧美日韩在线播放一区| 国产精品麻豆视频| 国产成人免费视频| 欧美tk—视频vk| 免费观看日韩av| 91麻豆精品国产91久久久使用方法| 久久久精品国产99久久精品芒果| 亚洲一区二区三区视频在线| 成人av动漫在线| 国产亚洲欧美色| 精品一区二区三区蜜桃| 欧美一区二区三区在| 午夜免费久久看| 欧美日韩中文国产| 亚洲v精品v日韩v欧美v专区| 欧洲精品视频在线观看| 亚洲视频一二三| 日本精品裸体写真集在线观看 | 一区二区三区蜜桃| 94-欧美-setu| 亚洲蜜桃精久久久久久久| 成年人午夜久久久| 国产精品成人免费在线| 99r国产精品| 亚洲另类春色校园小说| 成人av电影在线观看| 中文字幕一区二区三区四区不卡 | 午夜精品123| 精品污污网站免费看| 香蕉久久一区二区不卡无毒影院 | 激情亚洲综合在线| 欧美v日韩v国产v| 狠狠色丁香婷综合久久| 久久久亚洲综合| 粉嫩嫩av羞羞动漫久久久 | 五月天丁香久久| 日韩手机在线导航| 国产精品自拍毛片| 自拍偷拍国产精品| 欧美另类videos死尸| 精东粉嫩av免费一区二区三区| wwwwxxxxx欧美| 懂色av一区二区夜夜嗨| 亚洲精品国产一区二区三区四区在线| 欧美在线你懂得| 久久99精品国产| 亚洲精品五月天| 日韩视频在线永久播放| a级精品国产片在线观看| 一区二区三区四区不卡在线| 91精品国产入口| 成人免费毛片片v| 日韩激情av在线| 成人免费一区二区三区视频| 欧美精选在线播放| 成人亚洲一区二区一| 日日夜夜免费精品| 国产精品国产三级国产普通话蜜臀 | 捆绑调教一区二区三区| 成人欧美一区二区三区白人 | 欧美电视剧免费观看| 不卡的电影网站| 免费成人av资源网| 亚洲黄色小视频| 欧美激情自拍偷拍| 91精品欧美久久久久久动漫| 不卡电影一区二区三区| 久久精品国产亚洲高清剧情介绍 | 亚洲免费大片在线观看| 欧美精品一区二区三区在线| 欧美日韩一区国产| 岛国精品在线观看| 久久国内精品自在自线400部| 亚洲女厕所小便bbb| 久久色在线观看| 欧美变态tickle挠乳网站| 欧美网站大全在线观看| 91麻豆6部合集magnet| 国产成人免费视频网站| 激情综合亚洲精品| 日本视频一区二区| 石原莉奈在线亚洲二区| 成人欧美一区二区三区| 国产精品入口麻豆原神| 国产午夜精品在线观看| 久久免费美女视频| 久久综合久久综合亚洲| 欧美电影免费观看高清完整版| 欧美精品一二三| 欧美三级电影在线观看| 欧美色中文字幕| 欧美日韩免费视频| 欧美欧美午夜aⅴ在线观看| 日本黄色一区二区| 91麻豆国产在线观看| 99久久精品99国产精品| 不卡av在线免费观看| 岛国一区二区三区| 国产成人免费视频网站| 丁香婷婷综合色啪| 成人av网站在线观看免费| 成人免费看的视频| 9l国产精品久久久久麻豆| 懂色一区二区三区免费观看| 大美女一区二区三区| 99国产精品99久久久久久| 91蜜桃婷婷狠狠久久综合9色| 91欧美一区二区| 欧美体内she精高潮| 日韩午夜在线播放| 久久久激情视频| 国产精品动漫网站| 亚洲第一av色| 精品写真视频在线观看| 成人国产亚洲欧美成人综合网| 成人av综合在线| 在线免费观看一区| 日韩区在线观看| 国产精品美女久久久久aⅴ| 中文字幕一区二区三中文字幕| 亚洲国产视频一区二区| 精品无人码麻豆乱码1区2区| 不卡视频一二三| 欧美日韩夫妻久久| 欧美国产精品一区| 亚洲国产日韩精品| 国产精品亚洲成人| 欧美亚一区二区| 久久精品一二三| 亚洲综合色成人| 国产精品一卡二卡| 在线视频观看一区| 久久色在线视频| 性做久久久久久久久| 国产成人在线网站| 91精品国产一区二区三区香蕉| 久久久精品tv| 日韩国产成人精品| 91视频一区二区| 久久女同精品一区二区| 亚洲高清视频在线| av网站一区二区三区| 精品毛片乱码1区2区3区 | 激情文学综合插| 欧美日韩中文另类| 亚洲欧美影音先锋| 国产一区二区日韩精品| 欧美精品第1页| 亚洲精品欧美综合四区| 国产.欧美.日韩|