日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Javascript跨域访问解决方案

發(fā)布時間:2024/9/20 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Javascript跨域访问解决方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

由于安全方面的考慮,?Javascript?被限制了跨域訪問的能力,但是有時候我們希望能夠做一些合理的跨域訪問的事情,那么怎么辦呢?

這里分兩類情況:


?????????一、基于同一父域的子域之間頁面的訪問?
?????????????????參見如下?3?個?domain?域:

1?、?taobao.com
????????? 2?、?jipiao.taobao.com
????????? 3?、?promotion.taobao.com

它們有相同的父域???taobao.com


?????????二、基于不同父域頁面之間的訪問?
?????????????????參見如下?3?個?domain?域:

1?、?taobao.com
???????????? 2?、?baidu.com

3?、?sina.com.cn

?????它們具有不同的父域。

解決它們之間跨域的方案:

<!--[if !supportLists]-->①?<!--[endif]-->服務器?Proxy:???域?A?的頁面?JS?需要訪問域?B?下的鏈接獲取數(shù)據(jù),該方案在域?A?的服務器端建立一個?Proxy?程序?(?可能是?ASP?、?servlet?等任何服務端程序?)?,域?A?的頁面?JS?直接調(diào)用本域下的?Proxy?程序,?proxy?程序負責將請求發(fā)送給域?B?下的鏈接并獲取到數(shù)據(jù),最后再通過?Proxy?將數(shù)據(jù)返回給頁面?JS?使用。

經(jīng)過的訪問流程就是:?域?A?下?JS--?à?域?A?下?Proxy---?à?域?B?下的鏈接

例子:

第一步:

??域?A:??http://Jipiao.taobao.com/test.htm?????頁面上?javascript?腳本

view plaincopy to clipboardprint?
  • ???<mce:script?type=”text/javascript”><!--??
  • ???
  • ??
  • ????Var?sUrl=”?http://Jipiao.taobao.com/proxy.do?”;?//?本域下代理地址???
  • ??
  • var?callback?=??
  • {??
  • ???success:?function(res)?{???alert(res.responseText);???},???
  • ???failure:?function(res)?{??alert(‘failure’);},???
  • ???argument:{}???
  • }???
  • ??
  • ??YAHOO.util.Connect.asyncRequest(’GET’,?sUrl,?callback,?null);?????
  • ??
  • ????
  • //?--></mce:script>???
  • 第二步:

    Proxy?程序?(?這里假定是一個?servlet)?:

    view plaincopy to clipboardprint?
  • Public?class?Proxy?extends?…….{???
  • ??
  • ..doGet(……..){???
  • ??
  • HttpClient??client=……;???
  • ??
  • GetMethod?get=?new???GetMethod("?www.baidu.com/xxxxx.do?")?;//?訪問域?B?的鏈接???
  • ??
  • int?statusCode?=?client.executeMethod(?get?);???
  • ??
  • if?(statusCode?!=?HttpStatus.SC_OK)?{???
  • ??
  • ???
  • ????
  • ???
  • byte[]?responseBody?=?get.getResponseBody();??
  • ??
  • String?res=new?String(responseBody);??
  • ??
  • Httpresponse.getWriter().write(res);//??
  • 將數(shù)據(jù)返回給域??
  • A??
  • ??
  • ??
  • ????}???
  • ??
  • }???
  • ??
  • }???
  • ??

    <!--[if !supportLists]-->②?<!--[endif]-->??Script?標簽?:?域?A?頁面?http://Jipiao.taobao.com/test.htm?的?head?中寫一個空的?Script?標簽

    view plaincopy to clipboardprint?
  • <html>???
  • ??
  • ??<head>???
  • ??
  • ??<mce:script?id=”remoteScript”?type=”text/javascript”?src="””"?mce_src="””"?/><!--??
  • ???
  • ??
  • ??<head>???
  • ??
  • ??<body>???
  • ??
  • <script?type=”text/javascript”?>???
  • ??
  • ??Var?remoteScript=document.getElementById(‘remoteScript’);???
  • ??
  • ??remoteScript.src=”?www.baidu.com/xxxxx.do”;//?域?B?的鏈接???
  • ??
  • ??alert(remote.test);//?使用域?B?返回的?JSON?數(shù)據(jù)???
  • ??
  • ??alert(f[0]);???
  • //?--></mce:script>???
  • ??
  • ??</body>???
  • ??
  • </html>???
  • 注意:這種方案要求域?B?返回的數(shù)據(jù)必須是合法的?JSON?格式或者如?JS?文件的格式。

    域?B?返回的數(shù)據(jù)格式如下:

    view plaincopy to clipboardprint?
  • Var?remote={test:’hello’};???
  • ??
  • Var?f=[‘2,1];???
  • ??
  • {“test”:"hello","arrays":[2,1]}??
  • ?

    對于基于同一父域的子域之間頁面的訪問這一類情況,還有第三種方式:?
    ????③?隱藏?iframe:?即域?A jipiao.taobao.com/yyyy.htm?的頁面上寫一個隱藏的?iframe?,

    view plaincopy to clipboardprint?
  • <html>???
  • ??
  • ??<head>???
  • ??
  • <head>???
  • ??
  • ??<body>???
  • ??
  • <mce:script?type=”text/javascript”?><!--??
  • ???
  • ??
  • ??Document.domain=”taobao.com”;???
  • ??
  • ??Var?remoteHtml=document.getElementById(“remoteHtml”);???
  • ??
  • remoteHtml.src=”promotion.taobao.com/xxxx.htm”;//?這里訪問域?B?的鏈接???
  • ??
  • var?document=remoteHtml.ContentDocument;???
  • ??
  • ??…//?這里就可以使用?document?來操作域?B?中頁面?xxx.htm?的數(shù)據(jù)了???
  • //?--></mce:script>???
  • ??
  • <iframe?id=”remoteHtml”?src="””"?mce_src="””"???style="”diapay:none”/"?mce_style="”diapay:none”/">???
  • ??
  • ??</body>???
  • ??
  • </html>???
  • ??

    這里?promotion.taobao.com/xxxx.htm?頁面也需要設置?document.domain="taobao.com"?,?這種方法才能奏效。之所以這種?iframe?的方法不適合不同父域之間的跨域,是因為設置?document.domain?只能設置為自己的父域,而不是能設置為其他域,例如?:jiapiao.taobao.com?只能設置?document.domain=”taobao.com”?,而不是是?document.domain=”baidu.com”

    優(yōu)缺點比較:

    ??這里列舉的三種方案各有優(yōu)缺點:

    ??Proxy?方案優(yōu)點是可以適用用于幾乎所有的跨域訪問,而且只需要要一個域中進行開發(fā),另一個域可以提供任何類型格式的數(shù)據(jù)。缺點是這種方案經(jīng)過了中間?Proxy?,所以延遲可能稍微大一點,并且會加重本域服務器的負荷,開發(fā)工作量也稍微大一點。

    ??Script?標簽的方案可以說是非常簡單的,不用幾行代碼就搞定了事,不過它對返回的數(shù)據(jù)格式要求有點嚴格,只能是?Json?格式數(shù)據(jù)?,?如果是其他格式的數(shù)據(jù),那么這種方法就無能為力了。

    隱藏?iframe?方式也很簡單,它可以處理任何返回的數(shù)據(jù)格式,但它只適用在具有同一個父域下的跨域請求上,并且要求其他域得配合開發(fā),即需要設置?document.domain

    推薦閱讀文章:http://www.cnblogs.com/passer/archive/2008/07/16/1243811.html?

    ================

    補充:Script標簽標簽方法最好要求服務端返回的json需要有句柄,即 如 json={...} 什么的。因為客戶端需要使用這個句柄來引用。如果沒有,客戶端JS只有采用 var json=eval(jsonStr)方式來執(zhí)行,效率不是很高。還有一種形式就是客戶端傳入要回調(diào)的方法。例如 xxxx.do?callbackApi=ca

    服務端接收到callbackApi參數(shù)后,將json包裝在ca中,如:ca({.....});

    客戶端定義回調(diào)函數(shù)就可以訪問了。

    ?? function ca(json){

    ?????????.......

    ?? }

    不論如何,這種方法對于服務端都有一定耦合。

    轉(zhuǎn)載于:https://www.cnblogs.com/wbqsln/archive/2011/02/23/1962463.html

    總結(jié)

    以上是生活随笔為你收集整理的Javascript跨域访问解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。