成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析-創(chuàng)新互聯(lián)

這篇文章主要介紹使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營銷,提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營銷、微信平臺(tái)小程序開發(fā)、公眾號(hào)商城、等建站開發(fā),創(chuàng)新互聯(lián)網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。

跨域的安全限制都是對(duì)瀏覽器端來說的,服務(wù)器端是不存在跨域安全限制的。

瀏覽器的同源策略限制從一個(gè)源加載的文檔或腳本與來自另一個(gè)源的資源進(jìn)行交互。

如果協(xié)議,端口和主機(jī)對(duì)于兩個(gè)頁面是相同的,則兩個(gè)頁面具有相同的源,否則就是不同源的。

如果要在js里發(fā)起跨域請(qǐng)求,則要進(jìn)行一些特殊處理了。或者,你可以把請(qǐng)求發(fā)到自己的服務(wù)端,再通過后臺(tái)代碼發(fā)起請(qǐng)求,再將數(shù)據(jù)返回前端。

這里講下使用jquery的jsonp如何發(fā)起跨域請(qǐng)求及其原理。

先看下準(zhǔn)備環(huán)境:兩個(gè)端口不一樣,構(gòu)成跨域請(qǐng)求的條件。

獲取數(shù)據(jù):獲取數(shù)據(jù)的端口為9090

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

請(qǐng)求數(shù)據(jù):請(qǐng)求數(shù)據(jù)的端口為8080

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

1、先看下直接發(fā)起ajax請(qǐng)求會(huì)怎么樣

下面是發(fā)起請(qǐng)求端的代碼:

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>跨域測試</title>
 <script src="js/jquery-1.7.2.js"></script>
 <script>
 $(document).ready(function () {
  
  $("#btn").click(function () {
  $.ajax({
   url: 'http://localhost:9090/student',
   type: 'GET',
   success: function (data) {
   $(text).val(data);
   }
  });

  });
  
 });
 </script>
</head>
<body>
 <input id="btn" type="button" value="跨域獲取數(shù)據(jù)" />
 <textarea id="text" ></textarea>
</body>
</html>

請(qǐng)求的結(jié)果如下圖:可以看到跨域請(qǐng)求因?yàn)闉g覽器的同源策略被攔截了。

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

2、接下來看如何發(fā)起跨域請(qǐng)求。解決跨域請(qǐng)求的方式有很多,這里只說一下jquery的jsop方式及其原理。

首先我們需要明白,在頁面上直接發(fā)起一個(gè)跨域的ajax請(qǐng)求是不可以的,但是,在頁面上引入不同域上的js腳本卻是可以的,就像你可以在自己的頁面上使用<img src=""> 標(biāo)簽來隨意顯示某個(gè)域上的圖片一樣。

比如我在8080端口的頁面上請(qǐng)求一個(gè)9090端口的圖片:可以看到直接通過src跨域請(qǐng)求是可以的。

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

3、那么看下如何使用<script src="">來完成一個(gè)跨域請(qǐng)求:

當(dāng)點(diǎn)擊"跨域獲取數(shù)據(jù)"的按鈕時(shí),添加一個(gè)<script>標(biāo)簽,用于發(fā)起跨域請(qǐng)求;注意看請(qǐng)求地址后面帶了一個(gè)callback=showData的參數(shù);

showData即是回調(diào)函數(shù)名稱,傳到后臺(tái),用于包裹數(shù)據(jù)。數(shù)據(jù)返回到前端后,就是showData(result)的形式,因?yàn)槭莝cript腳本,所以自動(dòng)調(diào)用showData函數(shù),而result就是showData的參數(shù)。

至此,我們算是跨域把數(shù)據(jù)請(qǐng)求回來了,但是比較麻煩,需要自己寫腳本發(fā)起請(qǐng)求,然后寫個(gè)回調(diào)函數(shù)處理數(shù)據(jù),不是很方便。

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>跨域測試</title>
 <script src="js/jquery-1.7.2.js"></script>
 <script>
 //回調(diào)函數(shù)
 function showData (result) {
  var data = JSON.stringify(result); //json對(duì)象轉(zhuǎn)成字符串
  $("#text").val(data);
 }

 $(document).ready(function () {

  $("#btn").click(function () {
  //向頭部輸入一個(gè)腳本,該腳本發(fā)起一個(gè)跨域請(qǐng)求
  $("head").append("<script src='http://localhost:9090/student?callback=showData'><\/script>");
  });

 });
 </script>
</head>
<body>
 <input id="btn" type="button" value="跨域獲取數(shù)據(jù)" />
 <textarea id="text" ></textarea>

</body>
</html>

服務(wù)端:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 response.setCharacterEncoding("UTF-8");
 response.setContentType("text/html;charset=UTF-8");

 //數(shù)據(jù)
 List<Student> studentList = getStudentList();


 JSONArray jsonArray = JSONArray.fromObject(studentList);
 String result = jsonArray.toString();

 //前端傳過來的回調(diào)函數(shù)名稱
 String callback = request.getParameter("callback");
 //用回調(diào)函數(shù)名稱包裹返回?cái)?shù)據(jù),這樣,返回?cái)?shù)據(jù)就作為回調(diào)函數(shù)的參數(shù)傳回去了
 result = callback + "(" + result + ")";

 response.getWriter().write(result);
}

結(jié)果:

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

4、再來看jquery的jsonp方式跨域請(qǐng)求:

服務(wù)端代碼不變,js代碼如下:最簡單的方式,只需配置一個(gè)dataType:'jsonp' ,就可以發(fā)起一個(gè)跨域請(qǐng)求。jsonp指定服務(wù)器返回的數(shù)據(jù)類型為jsonp格式,可以看發(fā)起的請(qǐng)求路徑,自動(dòng)帶了一個(gè)callback=xxx,xxx是jquery隨機(jī)生成的一個(gè)回調(diào)函數(shù)名稱。

這里的success就跟上面的showData一樣,如果有success函數(shù)則默認(rèn)success()作為回調(diào)函數(shù)。

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>跨域測試</title>
 <script src="js/jquery-1.7.2.js"></script>
 <script>

 $(document).ready(function () {

  $("#btn").click(function () {

  $.ajax({
   url: "http://localhost:9090/student",
   type: "GET",
   dataType: "jsonp", //指定服務(wù)器返回的數(shù)據(jù)類型
   success: function (data) {
   var result = JSON.stringify(data); //json對(duì)象轉(zhuǎn)成字符串
   $("#text").val(result);
   }
  });

  });

 });
 </script>
</head>
<body>
 <input id="btn" type="button" value="跨域獲取數(shù)據(jù)" />
 <textarea id="text" ></textarea>

</body>
</html>

效果:

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

再看看如何指定特定的回調(diào)函數(shù):第30行代碼

回調(diào)函數(shù)你可以寫到<script>下(默認(rèn)屬于window對(duì)象),或者指明寫到window對(duì)象里,看jquery源碼,可以看到j(luò)sonp調(diào)用回調(diào)函數(shù)時(shí),是調(diào)用的window.callback。

然后看調(diào)用結(jié)果,發(fā)現(xiàn),請(qǐng)求時(shí)帶的參數(shù)是:callback=showData;調(diào)用回調(diào)函數(shù)的時(shí)候,先調(diào)用了指定的showData,然后再調(diào)用了success。所以,success是返回成功后必定會(huì)調(diào)用的函數(shù),就看你怎么寫了。

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>跨域測試</title>
 <script src="js/jquery-1.7.2.js"></script>
 <script>

 function showData (data) {
  console.info("調(diào)用showData");

  var result = JSON.stringify(data);
  $("#text").val(result);
 }

 $(document).ready(function () {

//  window.showData = function (data) {
//  console.info("調(diào)用showData");
//
//  var result = JSON.stringify(data);
//  $("#text").val(result);
//  }

  $("#btn").click(function () {

  $.ajax({
   url: "http://localhost:9090/student",
   type: "GET",
   dataType: "jsonp", //指定服務(wù)器返回的數(shù)據(jù)類型
   jsonpCallback: "showData", //指定回調(diào)函數(shù)名稱
   success: function (data) {
   console.info("調(diào)用success");
   }
  });
  });

 });
 </script>
</head>
<body>
 <input id="btn" type="button" value="跨域獲取數(shù)據(jù)" />
 <textarea id="text" ></textarea>

</body>
</html>

效果圖:

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

再看看如何改變callback這個(gè)名稱:第23行代碼

指定callback這個(gè)名稱后,后臺(tái)也需要跟著更改。

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>跨域測試</title>
 <script src="js/jquery-1.7.2.js"></script>
 <script>

 function showData (data) {
  console.info("調(diào)用showData");

  var result = JSON.stringify(data);
  $("#text").val(result);
 }

 $(document).ready(function () {

  $("#btn").click(function () {

  $.ajax({
   url: "http://localhost:9090/student",
   type: "GET",
   dataType: "jsonp", //指定服務(wù)器返回的數(shù)據(jù)類型
   jsonp: "theFunction", //指定參數(shù)名稱
   jsonpCallback: "showData", //指定回調(diào)函數(shù)名稱
   success: function (data) {
   console.info("調(diào)用success");
   }
  });
  });

 });
 </script>
</head>
<body>
 <input id="btn" type="button" value="跨域獲取數(shù)據(jù)" />
 <textarea id="text" ></textarea>

</body>
</html>

后臺(tái)代碼:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 response.setCharacterEncoding("UTF-8");
 response.setContentType("text/html;charset=UTF-8");

 //數(shù)據(jù)
 List<Student> studentList = getStudentList();


 JSONArray jsonArray = JSONArray.fromObject(studentList);
 String result = jsonArray.toString();

 //前端傳過來的回調(diào)函數(shù)名稱
 String callback = request.getParameter("theFunction");
 //用回調(diào)函數(shù)名稱包裹返回?cái)?shù)據(jù),這樣,返回?cái)?shù)據(jù)就作為回調(diào)函數(shù)的參數(shù)傳回去了
 result = callback + "(" + result + ")";

 response.getWriter().write(result);
}

效果圖:

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

最后看看jsonp是否支持POST方式:ajax請(qǐng)求指定POST方式

可以看到,jsonp方式不支持POST方式跨域請(qǐng)求,就算指定成POST方式,會(huì)自動(dòng)轉(zhuǎn)為GET方式;而后端如果設(shè)置成POST方式了,那就請(qǐng)求不了了。

jsonp的實(shí)現(xiàn)方式其實(shí)就是<script>腳本請(qǐng)求地址的方式一樣,只是ajax的jsonp對(duì)其做了封裝,所以可想而知,jsonp是不支持POST方式的。

<%@ page pageEncoding="utf-8" contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <title>跨域測試</title>
 <script src="js/jquery-1.7.2.js"></script>
 <script>

 $(document).ready(function () {

  $("#btn").click(function () {

  $.ajax({
   url: "http://localhost:9090/student",
   type: "POST", //post請(qǐng)求方式
   dataType: "jsonp",
   jsonp: "callback",
   success: function (data) {
   var result = JSON.stringify(data);
   $("#text").val(result);
   }
  });
  });

 });
 </script>
</head>
<body>
 <input id="btn" type="button" value="跨域獲取數(shù)據(jù)" />
 <textarea id="text" ></textarea>
</body>
</html>

效果圖:

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

再補(bǔ)充一點(diǎn),回到第一條:CORS頭缺少“Access-Control-Allow-Origin” 。

有時(shí)候你會(huì)發(fā)現(xiàn)其它都沒問題,出現(xiàn)這個(gè)錯(cuò)誤:這個(gè)錯(cuò)誤代表服務(wù)端拒絕跨域訪問。如果出現(xiàn)這個(gè)錯(cuò)誤,就需要在服務(wù)端設(shè)置允許跨域請(qǐng)求。

response.setHeader("Access-Control-Allow-Origin", "*"); 設(shè)置允許任何域名跨域訪問

使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析

設(shè)置可以跨域訪問:第6行代碼或第8行代碼,設(shè)置其中一個(gè)即可。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 response.setCharacterEncoding("UTF-8");
 response.setContentType("text/html;charset=UTF-8");

 // * 表示允許任何域名跨域訪問
 response.setHeader("Access-Control-Allow-Origin", "*");
 // 指定特定域名可以訪問
 response.setHeader("Access-Control-Allow-Origin", "http:localhost:8080/");

 //數(shù)據(jù)
 List<Student> studentList = getStudentList();

 JSONArray jsonArray = JSONArray.fromObject(studentList);
 String result = jsonArray.toString();

 //前端傳過來的回調(diào)函數(shù)名稱
 String callback = request.getParameter("callback");
 //用回調(diào)函數(shù)名稱包裹返回?cái)?shù)據(jù),這樣,返回?cái)?shù)據(jù)就作為回調(diào)函數(shù)的參數(shù)傳回去了
 result = callback + "(" + result + ")";

 response.getWriter().write(result);
}

jQuery ajax方式以jsonp類型發(fā)起跨域請(qǐng)求,其原理跟<script>腳本請(qǐng)求一樣,因此使用jsonp時(shí)也只能使用GET方式發(fā)起跨域請(qǐng)求。跨域請(qǐng)求需要服務(wù)端配合,設(shè)置callback,才能完成跨域請(qǐng)求。

以上是“使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站制作公司行業(yè)資訊頻道!

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站名稱:使用jquery的jsonp發(fā)起跨域請(qǐng)求的示例分析-創(chuàng)新互聯(lián)
URL分享:http://jinyejixie.com/article6/isiig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)動(dòng)態(tài)網(wǎng)站、用戶體驗(yàn)、定制開發(fā)、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)
蓬莱市| 阿坝县| 辽中县| 通许县| 南郑县| 资溪县| 金坛市| 邮箱| 孟州市| 佛山市| 伊金霍洛旗| 屏边| 延吉市| 宁夏| 景谷| 洪湖市| 英德市| 湾仔区| 玉山县| 太仓市| 临洮县| 康马县| 河池市| 黄石市| 和林格尔县| 开远市| 望江县| 故城县| 新竹市| 凤台县| 秦皇岛市| 蒙自县| 潼南县| 宁乡县| 漾濞| 辰溪县| 穆棱市| 陆丰市| 石泉县| 清原| 康平县|