最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java Ajax jsonp 跨域請求

 更新時間:2017年06月02日 11:19:46   作者:懶惰的幻想著  
本篇文章主要介紹了詳解Java Ajax jsonp 跨域請求,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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");
        }
      });

結果: Uncaught SyntaxError: Unexpected token!

what the fuck! 明明請求回來數(shù)據(jù),結果還是報錯。原因是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回調函數(shù)名的參數(shù)名(默認為:callback)
      jsonpCallback:"success_jsonpCallback",//自定義的jsonp回調函數(shù)名稱,默認為jQuery自動生成的隨機函數(shù)名
      timeout: 5000,
      contentType: 'application/json; charset=utf-8',
      success: function (result) {
        alter("aaaa");
      }
    });

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

復制代碼 代碼如下:

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

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

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

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

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

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

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

首先在客戶端注冊一個callback (如:'jsoncallback'), 然后把callback的名字(如:jsonp1236827957501)傳給服務器。注意:服務端得到callback的數(shù)值后,要用jsonp1236827957501(......)把將要輸出的json內容包括起來,此時,服務器生成 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))里。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 一文讀懂a(chǎn)va中的Volatile關鍵字使用

    一文讀懂a(chǎn)va中的Volatile關鍵字使用

    volatile關鍵字的作用保證了變量的可見性(visibility)。被volatile關鍵字修飾的變量,如果值發(fā)生了變更,其他線程立馬可見,避免出現(xiàn)臟讀的現(xiàn)象。這篇文章主要介紹了ava中的Volatile關鍵字使用,需要的朋友可以參考下
    2020-03-03
  • Java中的final關鍵字和抽象類詳解

    Java中的final關鍵字和抽象類詳解

    這篇文章主要介紹了Java中的final關鍵字和抽象類詳解,當不希望 類被繼承時,可以用final修飾比如不希望子類重寫父類時,當不希望某個局部變量被修改時,對參數(shù)進行修飾,需要的朋友可以參考下
    2023-07-07
  • servlet實現(xiàn)文件下載的步驟及說明詳解

    servlet實現(xiàn)文件下載的步驟及說明詳解

    這篇文章主要為大家詳細介紹了servlet實現(xiàn)文件下載的步驟及說明,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 使用SpringBoot生成war包的流程步驟

    使用SpringBoot生成war包的流程步驟

    一般情況下,在SpringBoot項目開發(fā)完成進行服務器部署時,都是打成JAR包進行部署運行的,但是在有些情況下也需要將其打成War包使用Tomcat進行部署,本篇文章就簡單介紹一下SpringBoot如何打成War包,需要的朋友可以參考下
    2024-10-10
  • 對比Java設計模式編程中的狀態(tài)模式和策略模式

    對比Java設計模式編程中的狀態(tài)模式和策略模式

    這篇文章主要介紹了Java設計模式編程中的狀態(tài)模式和策略模式對比,文中列舉了兩種模式的相似點和不同點,并都舉了代碼的實例作為參照,需要的朋友可以參考下
    2016-04-04
  • 詳解Spring3.x 升級至 Spring4.x的方法

    詳解Spring3.x 升級至 Spring4.x的方法

    本篇文章主要介紹了詳解Spring3.x 升級至 Spring4.x的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Java簡單實現(xiàn)動態(tài)代理模式過程解析

    Java簡單實現(xiàn)動態(tài)代理模式過程解析

    這篇文章主要介紹了Java動態(tài)代理模式簡單案例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • 理解java中的深復制和淺復制

    理解java中的深復制和淺復制

    這篇文章主要幫助大家理解java中的深復制和淺復制,對java中的深復制和淺復制進行剖析,感興趣的小伙伴們可以參考一下
    2016-02-02
  • SpringSecurity 手機號登錄功能實現(xiàn)

    SpringSecurity 手機號登錄功能實現(xiàn)

    這篇文章主要介紹了SpringSecurity 手機號登錄功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2023-12-12
  • springboot整合activity自動部署及部署文件命名流程

    springboot整合activity自動部署及部署文件命名流程

    這篇文章主要介紹了springboot整合activity自動部署及部署文件命名流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

香河县| 姜堰市| 唐海县| 察哈| 叙永县| 汕尾市| 从江县| 商城县| 大石桥市| 积石山| 子长县| 三台县| 靖西县| 新安县| 清徐县| 荔波县| 甘南县| 临潭县| 平原县| 罗城| 将乐县| 都兰县| 乐陵市| 基隆市| 玛纳斯县| 兴仁县| 苏州市| 宜良县| 根河市| 资溪县| 聂荣县| 大化| 玉环县| 溆浦县| 江孜县| 朝阳市| 郧西县| 甘洛县| 福建省| 花垣县| 五指山市|