跨域請求解決方案

2022-03-09 10:03:10 字數 3191 閱讀 4294

在前端開發過程中,難免和服務端產生資料互動。一般情況我們的請求分為這麼幾種情況:

只關注傳送,不關注接收

不僅要傳送,還要關注服務端返回的資訊

上面提到了乙個概念,我們這裡簡單做一下講解。什麼叫做跨域?一般情況下,跨域分為三種情況:跨協議、跨子域、跨網域名稱。下面距離梳理一下這三種情況。

我們需要知道的是,跨域請求只要滿足這是三種情況之一就會被認定為跨域請求。

目前流行比較廣的跨域請求解決方案有:window.name、document.domain、服務端**、jsonp、前端**。

以下介紹的方式只是實現原理,沒有過多考慮安全性,可以根據自己的情況進行選擇。

前端傳送乙個請求給隱藏的iframe,然後服務端每次將返回值,以js形式返回,然後iframe的父視窗獲取window.name的值。服務端返回資料形式為:

2014-11-18:

@pyzy:window.name的值必須是字串,需要使用json.stringify處理傳遞,獲取之後可以用json.parse處理進行使用

這個使用限制條件較多,必須是不同子域間,協議和埠號必須相同。比如:a.12306.cn和b.12306.cn之間相互操作,可以分別在兩個網域名稱下定義:document.domain = '12306.cn'; 這樣就實現了跨子域通訊。

這種情況不適合跨協議通訊,比較適合跨埠和跨網域名稱。這個前端基本上相當於普通的請求,我們所要訪問的介面都經過服務端的**,我們訪問的請求都是本域的。

我們用的比較多,原理就是在發起請求時,動態的在頁面載入乙個script標籤,因為src可以接收跨域資源,然後這個script標籤的資源是執行乙個js方法,並且將服務端返回的資料作為引數傳遞過來。這種情況唯一的缺點就是只能傳送get請求,不適用用post請求。jsonp返回的資料格式為:

callback();

和window.name的實現比較類似,將請求傳送到乙個隱藏的iframe,然後服務端返回類似這樣的內容:

然後proxy檔案,接收到這些引數,進行處理,轉化成類似與jsonp的返回值,執行頁面上的**。這種情況是可以傳送post請求的。

proxy檔案的內容,如下:

通過上面的介紹,簡單的知道了處理跨域請求的一些方法,下面整理了乙個基於jquery的,解決跨域的方法。

$(function()  param 要提交的資料

* @param [ajaxopt] ajax配置

* @param [https=false] 是否使用https協議

} $.extend(sync.prototype, [url] 請求鏈結

* @return promise物件

*/get: function(url) );

},/**

* 通過post方式提交,依賴psp_jump.html檔案

* @param [url] 請求鏈結

* @return promise物件

*/post: function(url) , this.param, );

var form = buildform(param, );

window[funname] = function (data))|(\[.*\])$/))

data[i] = value;}}

deferred.resolve(data);

};timer = settimeout(function());

}, this.ajaxopt.timeout);

// do some clear

deferred.always(function(data) catch (e)

});$(form).submit();

return deferred.then(this.done);

},/**

* 收到響應時預設**

* @param data 資料

* @return

*/done: function (data) else

return deferred.promise();

},/**

* 未收到響應時預設**

* @param error 錯誤資訊

* @return

*/fail: function(error) );

return deferred.promise();

} });

/*** 把資料物件轉成form元素

* @param data json資料

* @param opts form所需引數或其他資料

* @return

*/function buildform(data, opts)

opts.method = 'post';

var $form = $('').attr(opts).hide();

$.each(data, function (name, value) );

return $form[0]; }

window.sync = sync;

});

這樣我們就可以通過一下方式進行使用:

var login = function(data) 

login()

.done(function() )

.fail(function(error) );

至此就可以做到跨域請求了~

跨域請求解決方案

1.什麼叫js跨域請求 js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向乙個不同的域請求資料,或者通過js獲取頁面中不同域的框架中 iframe 的資料。什麼是不同的域 只要協議 網域名稱 埠有任何乙個不同,都被當作是不同的域。2.下面貼上一段請求 這用的是angularjs編...

跨域請求解決方案

跨域請求解決方案 js跨域請求的簡單介紹 這裡說的js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向乙個不同的域請求資料,或者通過js獲取頁面中不同域的框架中 iframe 的資料。只要協議 網域名稱 埠有任何乙個不同,都被當作是不同的域 跨域解決方案cors cors 是乙個w...

JS跨域請求解決方案

2 跨域解決方案cors 這裡說的js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向乙個不同的域請求資料,或者通過js獲取頁面中不同域的框架中 iframe 的資料。只要協議 網域名稱 或主機位址 埠有任何乙個不同,都被當作是不同的域。不同的域,網域名稱不同 不同的域,位址不一樣...