亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

java語言

Java Ajax jsonp跨域請求詳解

時間:2024-08-30 00:21:56 java語言 我要投稿
  • 相關(guān)推薦

Java Ajax jsonp跨域請求詳解

  怎樣用java代碼發(fā)起ajax 的jsonp并得到返回數(shù)據(jù)? 以下是百分網(wǎng)小編搜索整理的關(guān)于Java Ajax jsonp跨域請求詳解,感興趣的小伙伴們可以參考一下!想了解更多相關(guān)信息請持續(xù)關(guān)注我們應屆畢業(yè)生考試網(wǎng)!

  1、什么是JSONP

  一般來說位于 server1.example.com 的網(wǎng)頁無法與不是 server1.example.com的服務器溝通,而 HTML 的<script> 元素是一個例外。利用 <script> 元素的這個開放策略,網(wǎng)頁可以得到從其他來源動態(tài)產(chǎn)生的 JSON 資料,而這種使用模式就是所謂的 JSONP。用 JSONP 抓到的資料并不是 JSON,而是任意的JavaScript,用 JavaScript 直譯器執(zhí)行而不是用 JSON 解析器解析。

  JSONP是一種協(xié)議,為了解決客戶端請求服務器跨域的問題,但是并非是正式的傳輸協(xié)議。該協(xié)議的一個要點就是允許用戶傳遞一個callback參數(shù)給服務端,然后服務端返回數(shù)據(jù)時會將這個callback參數(shù)作為函數(shù)名來包裹住JSON數(shù)據(jù),這樣客戶端就可以隨意定制自己的函數(shù)來自動處理返回數(shù)據(jù)了.

  2、Ajax 請求其他域接口

  我這個項目要請求另外一個第一個后臺接口請求數(shù)據(jù),在頁面渲染的時候,通過ajax加載數(shù)據(jù)如下:

  $.ajax({

  url: 'http://www.xxx.cn/lalala?method=10082&page=1&pageSize=10',

  type: 'GET',

  dataType: 'json',

  timeout: 5000,

  contentType: 'application/json; charset=utf-8',

  success: function (result) {

  alter("aaaa");

  }

  });

  這樣就出現(xiàn)跨域的錯誤,如下所示:

  No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 500.

  這里就說明不允許跨域請求,那么怎么辦? 換成jsonp好了。就改了dataType這個字段。

  $.ajax({

  url: 'http://www.xxx.cn/lalala?method=10082&page=1&pageSize=10',

  type: 'GET',

  dataType: 'jsonp',

  timeout: 5000,

  contentType: 'application/json; charset=utf-8',

  success: function (result) {

  alter("aaaa");

  }

  });

  結(jié)果: Uncaught SyntaxError: Unexpected token!

  what the fuck! 明明請求回來數(shù)據(jù),結(jié)果還是報錯。原因是ajax請求服務器,而返回的數(shù)據(jù)格式不符合jsonp的返回格式,那么jsonp格式是什么樣的?

  Callback({msg:'this is json data'})

  這是什么叼東西,奇葩誰定義的!如果你這么想,看來你沒有仔細看第1點,JSON是一種輕量級的數(shù)據(jù)交換格式,像xml一樣。JSONP是一種使用JSON數(shù)據(jù)的方式,返回的不是JSON對象,是包含JSON對象的javaScript腳本。但是上圖是一段json串,所以報錯啦。

  3、參數(shù)返回處理

  有一點你會發(fā)現(xiàn)在你是用jsonp協(xié)議請求時,在參數(shù)中除了自己填寫的參數(shù)外還有名為callback的參數(shù),如圖:

  看看這個參數(shù)是什么東西,因為我在ajax請求的時候沒有指定,jsonp這個參數(shù),那么系統(tǒng)默認參數(shù)名為“callback”。沒有指定jsonpCallback參數(shù), 那么jquery會生成隨機的函數(shù)名,如上圖所示。

  比如我如下配置:

  $.ajax({

  url: 'http://www.xxx.cn/lalala?method=10082&page=1&pageSize=10',

  type: 'GET',

  dataType: 'jsonp',

  jsonp:'callbacka',//傳遞給請求處理程序或頁面的,用以獲得jsonp回調(diào)函數(shù)名的參數(shù)名(默認為:callback)

  jsonpCallback:"success_jsonpCallback",//自定義的jsonp回調(diào)函數(shù)名稱,默認為jQuery自動生成的隨機函數(shù)名

  timeout: 5000,

  contentType: 'application/json; charset=utf-8',

  success: function (result) {

  alter("aaaa");

  }

  });

  那么服務器亦可以通過下面方法獲取回調(diào)的函數(shù)名:

  復制代碼 代碼如下:

  string callbackFunName =request.getParameter("callbacka");//獲取的就是success_jsonpCallback 字符串

  注意:系統(tǒng)會區(qū)分函數(shù)名大小寫。

  那么下面按照格式包裝一下看看咯:

  String callback = request.getParameter("callback"); //不指定函數(shù)名默認 callback

  return callback+ "(" + jsonStr + ")"

  包了一下,結(jié)果真的不報錯,看下返回數(shù)據(jù)如下圖:

  4、JSONP的執(zhí)行過程

  首先在客戶端注冊一個callback (如:'jsoncallback'), 然后把callback的名字(如:jsonp1236827957501)傳給服務器。注意:服務端得到callback的數(shù)值后,要用jsonp1236827957501(......)把將要輸出的json內(nèi)容包括起來,此時,服務器生成 json 數(shù)據(jù)才能被客戶端正確接收。

  然后,以 javascript 語法的方式,生成一個function, function 名字就是傳遞上來的參數(shù) 'jsoncallback'的值 jsonp1236827957501 .

  最后,將 json 數(shù)據(jù)直接以入?yún)⒌姆绞,放置?function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端?蛻舳藶g覽器,解析script標簽,并執(zhí)行返回的 javascript 文檔,此時javascript文檔數(shù)據(jù),作為參數(shù), 傳入到了客戶端預先定義好的 callback 函數(shù)(如上例中jquery $.ajax()方法封裝的的success: function (json))里。

【Java Ajax jsonp跨域請求詳解】相關(guān)文章:

PHP處理Ajax請求與Ajax跨域問題05-26

PHP中檢測ajax請求的代碼實例10-25

Java語言的作用域及分類11-02

java list的用法詳解08-24

JAVA如何獲取HTTP請求頭10-22

基于PHP+Ajax實現(xiàn)表單驗證的詳解08-22

常用Java排序算法詳解09-17

Java不可變類型的詳解09-10

Java內(nèi)存區(qū)域的使用詳解08-28

Java中Class對象詳解09-03