新聞中心
什么是javascript跨域訪問
JavaScript出于安全方面的考慮,不允許跨域調(diào)用其他頁面的對(duì)象。但在安全限制的同時(shí)也給注入iframe或是ajax應(yīng)用上帶來了不少麻煩。這里把涉及到跨域的一些問題簡單地整理一下:
成都創(chuàng)新互聯(lián)公司專注于大通網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供大通營銷型網(wǎng)站建設(shè),大通網(wǎng)站制作、大通網(wǎng)頁設(shè)計(jì)、大通網(wǎng)站官網(wǎng)定制、微信平臺(tái)小程序開發(fā)服務(wù),打造大通網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供大通網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
首先什么是跨域,簡單地理解就是因?yàn)镴avaScript同源策略的限制,a.com 域名下的js無法操作b.com或是c.a.com域名下的對(duì)象。更詳細(xì)的說明可以看下表:
特別注意兩點(diǎn):
第一,如果是協(xié)議和端口造成的跨域問題“前臺(tái)”是無能為力的,
第二:在跨域問題上,域僅僅是通過“URL的首部”來識(shí)別而不會(huì)去嘗試判斷相同的ip地址對(duì)應(yīng)著兩個(gè)域或兩個(gè)域是否在同一個(gè)ip上。
“URL的首部”指window.location.protocol +window.location.host,也可以理解為“Domains, protocols and ports must match”。
jsonp跨域的原理是什么?
jsonp其核心思想是利用JS標(biāo)簽里面的跨域特性進(jìn)行跨域數(shù)據(jù)訪問,在JS標(biāo)簽里面存在的是一個(gè)跨域的URL,實(shí)際執(zhí)行的時(shí)候通過這個(gè)URL獲得一段字符串,這段返回的字符串必須是一個(gè)合法的JS調(diào)用,通過EVAL這個(gè)字符串來完成對(duì)獲得的數(shù)據(jù)的處理。
JSONP(JSON with Padding(填充))是JSON的一種“使用模式”,可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問的問題。
JSONP是一個(gè)非官方的協(xié)議,它允許在服務(wù)器端集成Script tags返回至客戶端,通過javascript callback的形式實(shí)現(xiàn)跨域訪問(這僅僅是JSONP簡單的實(shí)現(xiàn)形式)。
相關(guān)信息:
由于瀏覽器同源策略的限制,非同源下的請(qǐng)求,都會(huì)產(chǎn)生跨域問題,jsonp即是為了解決這個(gè)問題出現(xiàn)的一種簡便解決方案。
同源策略即:同一協(xié)議,同一域名,同一端口號(hào)。當(dāng)其中一個(gè)不滿足時(shí),我們的請(qǐng)求即會(huì)發(fā)生跨域問題。
JavaScript 怎么跨域獲取 iframe 中的內(nèi)容
要解釋這個(gè)問題,首先要解釋兩個(gè)技術(shù)點(diǎn)。
每個(gè)“窗口”都是一個(gè)JS Runtime,即JS的運(yùn)行時(shí)。如果只有一個(gè)窗口,那么就只有一個(gè)Runtime;如果一個(gè)窗口下面還有一個(gè)iframe,那么就有兩個(gè)Runtime;以此類推。
Runtime之間互操作(或者通信)是有跨域限制的。也就是說,如果這個(gè)窗口本身是a.baidu.com域名下的頁面,那么如果這個(gè)頁面下還有一個(gè)iframe,這個(gè)iframe中加載的頁面是b.baidu.com域名下的。那么外層的JS。就不能跟這個(gè)iframe中的內(nèi)容互操作(或者通信)。
因此外層Runtime中的JS想操作內(nèi)層iframe中的內(nèi)容,就必須要避免跨域限制。要么內(nèi)層iframe加載頁面的域名跟外層是一樣的。要么就是需要在內(nèi)層iframe加載的頁面中執(zhí)行document.domain = 'baidu.com';從而設(shè)置跟外層的主域相同。
例如,當(dāng)前頁面是a.baidu.com/test.html
html
head
/head
body
iframe id="iFrm1" src = "0c893329b8c9af6ff578db9b1a128d13"margin: 0px; padding: 0px; color: rgb(69, 69, 69); font-family: arial, 宋體, sans-serif, tahoma, 'Microsoft YaHei'; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-tap-highlight-color: rgba(26, 26, 26, 0.301961); -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"
iframe中加載的頁面內(nèi)容如下:
html
head
/head
body
div id="innerDiv"恭喜操作到內(nèi)部iframe中的元素了?。?!/div
script
document.domain = 'baidu.com';
/script
/body
/html
在HTML5中新增了postMessage的API。可以方便窗口跟內(nèi)部iframe之間進(jìn)行通信,并且可以實(shí)現(xiàn)跨主域通信。但是有一些限制,1.老版本的瀏覽器一般不支持。2.父窗口只能向iframe中發(fā)送信息,iframe只能收消息,且父窗口不能直接操作iframe中的內(nèi)容。3.父窗口發(fā)送的數(shù)據(jù)也是有限制的。只能發(fā)送基本數(shù)據(jù)類型或者plain object。
怎樣用JS跨域?qū)崿F(xiàn)POST
這次給大家?guī)碓鯓佑肑S跨域?qū)崿F(xiàn)POST,JS跨域?qū)崿F(xiàn)POST的注意事項(xiàng)有哪些,下面就是實(shí)戰(zhàn)案例,一起來看一下。
javascript 跨域是一個(gè)很常見的問題,其中 jsonp 是一個(gè)最常用的手段,但是 jsonp 只支持 get,不支持 post,所以如果想通過 jsonp 來 post 一些數(shù)據(jù),就頭大了。
此處通過在一個(gè) iframe 中生成 form 表單的形式來實(shí)現(xiàn) post,并通過 postMessage 來向調(diào)用者返回值。
第一步,我們先實(shí)現(xiàn)一個(gè)接受 jsonp 的后端代碼,至于用什么語言實(shí)現(xiàn),各位自已決定。
js跨域調(diào)用如何實(shí)現(xiàn)?
1.什么是跨域
經(jīng)常會(huì)在頁面上使用ajax請(qǐng)求訪問其他服務(wù)器的數(shù)據(jù),此時(shí),客戶端會(huì)出現(xiàn)跨域問題.
跨域問題是由于javascript語言安全限制中的同源策略造成的.
簡單來說,同源策略是指一段腳本只能讀取來自同一來源的窗口和文檔的屬性,這里的同一來源指的是主機(jī)名、協(xié)議和端口號(hào)的組合.
2.解決方案:
服務(wù)器端:
protected?void?Page_Load(object?sender,?EventArgs?e)
{
string?result?=?"callback({\"name\":\"zhangsan\",\"date\":\"2012-12-03\"})";
Response.Clear();
Response.Write(result);
Response.End();
}
客戶端:
!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?""
html?xmlns=""
head
title/title
script?type="text/javascript"
var?result?=?null;
window.onload?=?function?()?{
var?script?=?document.createElement("script");
script.type?=?"text/javascript";
script.src?=?"";
var?head?=?document.getElementsByTagName("head")[0];
head.insertBefore(script,?head.firstChild);
};
function?callback(data)?{
result?=?data;
}
function?b_click()?{
alert(result.name);
}
/script
/head
body
input?type="button"?value="click?me!"?onclick="b_click();"?/
/body
/html
javascript 跨域 問題
XMLHttpRequest2 進(jìn)行跨域訪問時(shí)需要服務(wù)器許可,不是任何域都接受跨域請(qǐng)求的。先來看一下從 Yahoo YQL 域返回的響應(yīng)頭(Response Header ):
HTTP/1.1?200?OK
Set-Cookie:?AO="o=1s=1dnt=1";?Version=1;?Domain=yahoo.com;?Max-Age=630720000;?Expires=Sat,?18-Jun-2033?10:07:41?GMT;?Path=/
Access-Control-Allow-Origin:?*
Cache-Control:?public,?max-age=899
Content-Type:?text/xml;charset=utf-8
Content-Encoding:?gzip
Vary:?Accept-Encoding
Date:?Sun,?23?Jun?2013?10:07:40?GMT
注意里面有一條標(biāo)識(shí) Access-Control-Allow-Origin:* ,這就表示允許跨域訪問,所以可以正常訪問該域,而對(duì)于其他沒有該標(biāo)識(shí)的域就會(huì)出現(xiàn)禁止訪問提示。
那么如何設(shè)置呢?如果要接受跨域訪問請(qǐng)求,就必須在服務(wù)器端返回的資源中加入?Access-Control-Allow-Origin 頭標(biāo)識(shí),?Access-Control-Allow-Origin 的值可以是 URL?或 *,如果是 URL 則只會(huì)允許來自該 URL 的請(qǐng)求,* 則允許任何域的請(qǐng)求。比如,在 HTML 中可以設(shè)置:
meta?http-equiv="Access-Control-Allow-Origin"?content="*"
或
meta?http-equiv="Access-Control-Allow-Origin"?content=""
文章標(biāo)題:javascript跨域,js解決跨域的三種方法
URL標(biāo)題:http://fisionsoft.com.cn/article/dsddcsh.html