用jQuery解決跨域訪問

2022-07-23 03:45:11 字數 3842 閱讀 7509

瀏覽器端跨域訪問一直是個問題, 多數研發人員對待js的態度都是好了傷疤忘了疼,所以病發的時候,時不時地都要疼上一疼.記得很久以前使用iframe 加script domain 宣告,yahoo js util 的方式解決二級網域名稱跨域訪問的問題. 

時間過得好快,又被拉回js戰場時, 跨域問題這個傷疤又開疼了.

好在,有jquery幫忙,跨域問題似乎沒那麼難纏了.這次也藉此機會對跨域問題來給刨根問底,結合實際的開發專案,查閱了相關資料,算是解決了跨域問題..有必要記下來備忘.

跨域的安全限制都是指瀏覽器端來說的.伺服器端是不存在跨域安全限制的,

所以通過本機伺服器端通過類似httpclient方式完成「跨域訪問」的工作,然後在瀏覽器端用ajax獲取本機伺服器端「跨域訪問」對應的url.來間接完成跨域訪問也是可以的.但很顯然開發量比較大,但限制也最少,很多widget開放平台server端(如sohu部落格開放平台)其實就麼搞的.不在本次討論範圍.

要討論的是瀏覽器端的真正跨域訪問,推薦的是目前jquery $.ajax()支援get方式的跨域,這其實是採用jsonp的方式來完成的.

真實案例:

});注意:$.getjson(" http://跨域的dns/document!searchjsonresult.action?name1="+value1+"&jsoncallback=?",

function(json)

});這種方式其實是上例$.ajax() api的一種高階封裝,有些$.ajax api底層的引數就被封裝而不可見了.

這樣,jquery就會拼裝成如下的url get請求

http://跨域的dns/document!searchjsonresult.action?&jsoncallback=jsonp1236827957501&_=1236828192549&searchword=%e7%94%a8%e4%be%8b¤tuserid=5351&conditionbean.pagesize=15

在響應端(http://跨域的dns/document!searchjsonresult.action),

通過 jsoncallback = request.getparameter("jsoncallback") 得到jquery端隨後要**的js function name:jsonp1236827957501

然後 response的內容為乙個script tags:"jsonp1236827957501("+按請求引數生成的json陣列+")";

jquery就會通過**方法動態載入呼叫這個js tag:jsonp1236827957501(json陣列);

這樣就達到了跨域資料交換的目的.

jsonp的最基本的原理是:動態新增乙個是一致的(qq空間就是大量採用這種方式來實現跨域資料交換的) .jsonp是一種指令碼注入(script injection)行為,所以也有一定的安全隱患.

注意,jquey是不支援post方式跨域的.

為什麼呢?

雖然採用post +動態生成iframe是可以達到post跨域的目的(有位js牛人就是這樣把jquery1.2.5 打patch的),但這樣做是乙個比較極端的方式,不建議採用.

也可以說get方式的跨域是合法的,post方式從安全角度上,被認為是不合法的, 萬不得已還是不要劍走偏鋒..

client端跨域訪問的需求看來也引起w3c的注意了,看資料說html5 websocket標準支援跨域的資料交換,應該也是乙個將來可選的跨域資料交換的解決方案.

**部落格:

瀏覽器端跨域訪問一直是個問題, 多數研發人員對待js的態度都是好了傷疤忘了疼,所以病發的時候,時不時地都要疼上一疼.記得很久以前使用iframe 加script domain 宣告,yahoo js util 的方式解決二級網域名稱跨域訪問的問題. 

時間過得好快,又被拉回js戰場時, 跨域問題這個傷疤又開疼了.

好在,有jquery幫忙,跨域問題似乎沒那麼難纏了.這次也藉此機會對跨域問題來給刨根問底,結合實際的開發專案,查閱了相關資料,算是解決了跨域問題..有必要記下來備忘.

跨域的安全限制都是指瀏覽器端來說的.伺服器端是不存在跨域安全限制的,

所以通過本機伺服器端通過類似httpclient方式完成「跨域訪問」的工作,然後在瀏覽器端用ajax獲取本機伺服器端「跨域訪問」對應的url.來間接完成跨域訪問也是可以的.但很顯然開發量比較大,但限制也最少,很多widget開放平台server端(如sohu部落格開放平台)其實就麼搞的.不在本次討論範圍.

要討論的是瀏覽器端的真正跨域訪問,推薦的是目前jquery $.ajax()支援get方式的跨域,這其實是採用jsonp的方式來完成的.

真實案例:

});注意:$.getjson(" http://跨域的dns/document!searchjsonresult.action?name1="+value1+"&jsoncallback=?",

function(json)

});這種方式其實是上例$.ajax() api的一種高階封裝,有些$.ajax api底層的引數就被封裝而不可見了.

這樣,jquery就會拼裝成如下的url get請求

http://跨域的dns/document!searchjsonresult.action?&jsoncallback=jsonp1236827957501&_=1236828192549&searchword=%e7%94%a8%e4%be%8b¤tuserid=5351&conditionbean.pagesize=15

在響應端(http://跨域的dns/document!searchjsonresult.action),

通過 jsoncallback = request.getparameter("jsoncallback") 得到jquery端隨後要**的js function name:jsonp1236827957501

然後 response的內容為乙個script tags:"jsonp1236827957501("+按請求引數生成的json陣列+")";

jquery就會通過**方法動態載入呼叫這個js tag:jsonp1236827957501(json陣列);

這樣就達到了跨域資料交換的目的.

jsonp的最基本的原理是:動態新增乙個是一致的(qq空間就是大量採用這種方式來實現跨域資料交換的) .jsonp是一種指令碼注入(script injection)行為,所以也有一定的安全隱患.

注意,jquey是不支援post方式跨域的.

為什麼呢?

雖然採用post +動態生成iframe是可以達到post跨域的目的(有位js牛人就是這樣把jquery1.2.5 打patch的),但這樣做是乙個比較極端的方式,不建議採用.

也可以說get方式的跨域是合法的,post方式從安全角度上,被認為是不合法的, 萬不得已還是不要劍走偏鋒..

client端跨域訪問的需求看來也引起w3c的注意了,看資料說html5 websocket標準支援跨域的資料交換,應該也是乙個將來可選的跨域資料交換的解決方案.

用serveResource解決跨域訪問問題

簡介 眾所周知,跨域問題是十分常見的需求,比如讓客戶端的ext js控制項可以渲染來自伺服器端的json物件。我們可以用很多很多方法來解決,比如jsonp.但是,在liferay中,我們可以用serveresource方法來優雅的解決跨域訪問問題。白板分析 以下是摘自我在技術討論會上的白板 解決方法...

跨域訪問及Nginx解決跨域訪問

同源策略 sameorigin policy 是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。可以說web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。同源策略是處於對使用者安全的考慮,如果非同源就會受到以下限制 但是事實是經常...

跨域訪問Jquery實現

跨域訪問 js實現。環境 net3.5 jquery json.net 因為在跨域實現,所以這裡新建 這個 只需要 1 customer 類public class customer public string customername public string memo public strin...