JSONP跨域請(qǐng)求
什么是跨域:
1、域名不同
2、域名相同端口不同
js出于對(duì)安全考慮不支持跨域請(qǐng)求。我們可以使用JSONP解決跨域問(wèn)題。
一、JSONP是什么
JSONP(JSON with Padding)是JSON的一種“使用模式”,可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問(wèn)的問(wèn)題。由于同源策略,一般來(lái)說(shuō)位于 server1.example.com 的網(wǎng)頁(yè)js是無(wú)法與不是 server1.example.com的服務(wù)器溝通,而 HTML 的<script> 元素是一個(gè)例外。利用 <script> 元素的這個(gè)開(kāi)放策略,網(wǎng)頁(yè)可以得到從其他來(lái)源動(dòng)態(tài)產(chǎn)生的 JSON 資料,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料并不是 JSON,而是任意的JavaScript,用 JavaScript 直譯器執(zhí)行而不是用 JSON 解析器解析。
原理:瀏覽器在js請(qǐng)求中,是允許通過(guò)script標(biāo)簽的src跨域請(qǐng)求,可以在請(qǐng)求的結(jié)果中添加回調(diào)方法名,在請(qǐng)求頁(yè)面中定義方法,既可獲取到跨域請(qǐng)求的數(shù)據(jù)。(js請(qǐng)求的不是一個(gè)單純的json數(shù)據(jù)而是一段包含json數(shù)據(jù)的js腳本)

二、模擬JSONP
服務(wù)器域名:http://localhost:8081/rest/itemcat/list
客戶端服務(wù)器:http://localhost:8082/test.html
1、普通的JS跨域請(qǐng)求
服務(wù)器數(shù)據(jù):

客戶端請(qǐng)求代碼:
$(function(){
$.ajax( {url: "http://localhost:8081/rest/itemcat/list?callback=myFunction",
success: function(data){
console.info(data)
}});
});
結(jié)果
XMLHttpRequest cannot load http://localhost:8081/rest/itemcat/list?callback=myFunction. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8082' is therefore not allowed access.
2、模擬JSONP請(qǐng)求
客戶端請(qǐng)求代碼:
$(function(){
greateScript("http://localhost:8081/rest/itemcat/list");
function greateScript(src) {
$("<script><//script>").attr("src", src).appendTo("body")
}
});
結(jié)果:
list?_=1488425374097:1 Uncaught SyntaxError: Unexpected token :
三、使用JSONP
環(huán)境:
服務(wù)器域名:http://localhost:8081/rest/itemcat/list
客戶端服務(wù)器:http://localhost:8082/test.html
服務(wù)端代碼(本人使用springmvc4):
@RequestMapping("/itemcat/list")
@ResponseBody
public Object getItemCatList(String callback) {
CatResult catResult = itemCatService.getItemCatList();
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(catResult);
//設(shè)置JSONP回調(diào)函數(shù)
mappingJacksonValue.setJsonpFunction(callback);
return mappingJacksonValue;
}
客戶端調(diào)用代碼:
$(function(){
$.ajax(
{ url: "http://localhost:8081/rest/itemcat/list",
dataType: "jsonp",
jsonp: "callback",
success: function(data){
console.info(data)
}});
});
結(jié)果:

看返回結(jié)果可以發(fā)現(xiàn)返回的數(shù)據(jù)不是一段單純的json數(shù)據(jù),而是一段js函數(shù)。
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
深入探究JavaScript中for循環(huán)的效率問(wèn)題及相關(guān)優(yōu)化
這篇文章主要介紹了JavaScript中for循環(huán)的效率問(wèn)題及相關(guān)優(yōu)化,文中談到了Underscore.js庫(kù)及循環(huán)在各個(gè)瀏覽器js解釋器下的表現(xiàn),需要的朋友可以參考下2016-03-03
教你用純JS實(shí)現(xiàn)語(yǔ)雀的劃詞高亮功能
最近在搞一個(gè)網(wǎng)站,需要在內(nèi)容區(qū)域?qū)崿F(xiàn)劃詞高亮功能,所以下面這篇文章主要給大家介紹了關(guān)于如何用純JS實(shí)現(xiàn)語(yǔ)雀的劃詞高亮功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
JS?for?in遍歷對(duì)象順序不對(duì)解決辦法
最近使用for-in語(yǔ)句遍歷對(duì)象屬性時(shí)發(fā)現(xiàn)遍歷順序并非屬性構(gòu)建順序,這篇文章主要給大家介紹了關(guān)于JS?for?in遍歷對(duì)象順序不對(duì)的解決辦法,需要的朋友可以參考下2023-11-11
JavaScript變速動(dòng)畫(huà)函數(shù)封裝添加任意多個(gè)屬性
這篇文章主要介紹了JavaScript變速動(dòng)畫(huà)函數(shù)封裝添加任意多個(gè)屬性 ,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
JavaScript使用performance實(shí)現(xiàn)查看內(nèi)存
這篇文章主要為大家詳細(xì)介紹了JavaScript如何使用performance實(shí)現(xiàn)查看內(nèi)存,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
利用js判斷瀏覽器類(lèi)型(是否為IE,Firefox,Opera瀏覽器)
我們開(kāi)發(fā)的人來(lái)說(shuō)經(jīng)常要加個(gè)判斷,要不可能某些功能沒(méi)法正常使用。要是沒(méi)加個(gè)判斷就會(huì)給大家?guī)?lái)些麻煩2013-11-11
three.js中文文檔學(xué)習(xí)之如何本地運(yùn)行詳解
這篇文章主要給大家介紹了關(guān)于three.js中文文檔學(xué)習(xí)之如何在本地運(yùn)行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
bootstrap響應(yīng)式導(dǎo)航條模板使用詳解(含下拉菜單,彈出框)
這篇文章主要為大家詳細(xì)介紹了bootstrap響應(yīng)式導(dǎo)航條模板使用詳解,含下拉菜單,彈出框效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11

