欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JSONP跨域GET請求解決Ajax跨域訪問問題

 更新時間:2014年12月31日 08:50:33   投稿:hebedich  
本文主要是介紹了JSONP跨域是如何實(shí)現(xiàn)的,并探討下JSONP跨域的原理。以及采用JSONP跨域GET請求解決Ajax跨域訪問問題,需要的朋友可以參考下

前幾天,工作上有一新需求,需要前端web頁面異步調(diào)用后臺的Webservice方法返回信息。實(shí)現(xiàn)方法有多種,本例采用jQuery+Ajax,完成后,在本地調(diào)試了一切ok,但是部署到服務(wù)器上以后就出現(xiàn)問題了,后臺服務(wù)調(diào)用沒有響應(yīng),怎么回事?代碼沒怎么改動,唯一修改的地方就是jQuery的ajax方法中的url地址。難道是這里的問題,經(jīng)過檢查和調(diào)試,發(fā)現(xiàn)原來是同源策略在作怪,我們知道,JavaScript或jQuery是在Web前端開發(fā)中經(jīng)常使用的動態(tài)腳本技術(shù)。在JavaScript中,有一個很重要的安全性限制,被稱為“Same- Origin Policy”(同源策略)。這一策略對于JavaScript代碼能夠訪問的頁面內(nèi)容做了很重要的限制,即JavaScript只能訪問與包含它的文檔或腳本 在同一域名下的內(nèi)容。不同域名下的腳本不能互相訪問,即便是子域也不行。關(guān)于同源策略,讀者可百度更詳細(xì)的解釋,這里不再贅述。

但是有時候又不可避免地需要進(jìn)行跨域操作,這時候“同源策略”就是一個限制了,怎么辦呢?采用JSONP跨域GET請求是一個常用的解決方案,下面我們來看一下JSONP跨域是如何實(shí)現(xiàn)的,并探討下JSONP跨域的原理。

這里提到了JSONP,那有人就問了,它同JSON有什么區(qū)別不同和區(qū)別呢,接下我們就來看看,百度百科有以下說明:

JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集。 JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語言。易于人閱讀和編寫,同時也易于機(jī)器解析和生成(網(wǎng)絡(luò)傳輸速度快)。

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

到這里,應(yīng)該明白了,JSON是一種輕量級的數(shù)據(jù)交換格式,像xml一樣,是用來描述數(shù)據(jù)間的。JSONP是一種使用JSON數(shù)據(jù)的方式,返回的不是JSON對象,是包含JSON對象的javaScript腳本。

那JSONP是如何工作的呢,我們知道,由于同源策略的限制,XmlHttpRequest只允許請求當(dāng)前源(域名、協(xié)議、端口)的資源。若要跨域請求出于安全性考慮是不行的,但是我們發(fā)現(xiàn),Web頁面上調(diào)用js文件時則不受是否跨域的影響,而且擁有”src”這個屬性的標(biāo)簽都擁有跨域的能力,比如<script>、<img>、<iframe>,這時候,聰明的程序猿就想到了變通的方法,如果要進(jìn)行跨域請求, 通過使用html的script標(biāo)記來進(jìn)行跨域請求,并在響應(yīng)中返回要執(zhí)行的script代碼,其中可以直接使用JSON傳遞 javascript對象。即在跨域的服務(wù)端生成JSON數(shù)據(jù),然后包裝成script腳本回傳,著不就突破同源策略的限制,解決了跨域訪問的問題了么。

下面我們就看下怎么實(shí)現(xiàn):

前端代碼:

復(fù)制代碼 代碼如下:

function CallWebServiceByJsonp() {
        $("#SubEquipmentDetails").html('');
        $.ajax({
            type: "GET",
            cache: false,
            url: "http://servername/webservice/webservice.asmx/GetSingleInfo",
            data: { strCparent: $("#Equipment_ID").val() },
            dataType: "jsonp",
            //jsonp: "callback",
            jsonpCallback: "OnGetMemberSuccessByjsonp"
        });
}
function OnGetMemberSuccessByjsonp(data) {
    //處理data
    alert(data);
}

后端的WebService代碼:

復(fù)制代碼 代碼如下:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
public void GetSingleInfo(string strCparent)
{
    string ret = string.Empty;
    HttpContext.Current.Response.ContentType = "application/json;charset=utf-8";
    string jsonCallBackFunName = HttpContext.Current.Request.Params["callback"].ToString();
    //string jsonCallBackFunName1 = HttpContext.Current.Request.QueryString["callback"].Trim();
    //上面代碼必須
    //中間代碼執(zhí)行自己的業(yè)務(wù)操作,可返回自己的任意信息(多數(shù)據(jù)類型)
    BLL.equipment eq_bll = new BLL.equipment();
    List<Model.equipment> equipmentList = new List<Model.equipment>();
    equipmentList = eq_bll.GetModelEquimentList(strCparent);
    ret = JsonConvert.SerializeObject(equipmentList);
    //下面代碼必須
    HttpContext.Current.Response.Write(string.Format("{0}({1})", jsonCallBackFunName, ret));
    HttpContext.Current.Response.End();
}

如上所示,前端的CallWebServiceByJsonp方法采用jQuery的ajax方法調(diào)用后端的Web服務(wù)GetSingleInfo方法,后臺的GetSingleInfo方法,使用前端的回調(diào)方法OnGetMemberSuccessByjsonp包裝后臺的業(yè)務(wù)操作的JSON對象,返回給前端一段javascript片段執(zhí)行。巧妙的解決了跨域訪問問題。

JSONP的缺點(diǎn):

JSONP不提供錯誤處理。如果動態(tài)插入的代碼正常運(yùn)行,你可以得到返回,但是如果失敗了,那么什么都不會發(fā)生。

小伙伴們是否對JSONP跨域GET請求解決Ajax跨域訪問問題有所了解了呢,本文的思路還是非常不錯的,推薦給大家。

  • ASP Json Parser修正版

    ASP Json Parser修正版

    之前因?yàn)橐胘son,在網(wǎng)上,json Generator就不少,但是,parser鮮有后來,在一個老外的啟發(fā)下,寫了一個praser,其實(shí)超簡單,就是利用了JS的eval來parse,然后,把對象再返回給vbscript代碼。
    2009-12-12
  • 簡明json介紹

    簡明json介紹

    不要認(rèn)為JSON是種新的應(yīng)用 ,其實(shí)JSON就是javascript支持的一種對象直接量。
    2008-09-09
  • 將List對象列表轉(zhuǎn)換成JSON格式的類實(shí)現(xiàn)方法

    將List對象列表轉(zhuǎn)換成JSON格式的類實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄獙ist對象列表轉(zhuǎn)換成JSON格式的類實(shí)現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • JSONP跨域GET請求解決Ajax跨域訪問問題

    JSONP跨域GET請求解決Ajax跨域訪問問題

    本文主要是介紹了JSONP跨域是如何實(shí)現(xiàn)的,并探討下JSONP跨域的原理。以及采用JSONP跨域GET請求解決Ajax跨域訪問問題,需要的朋友可以參考下
    2014-12-12
  • JS中JSON.parse(JSON.stringify())實(shí)現(xiàn)深拷貝

    JS中JSON.parse(JSON.stringify())實(shí)現(xiàn)深拷貝

    深拷貝就是完全拷貝一份新的對象,本文主要介紹了JS中JSON.parse(JSON.stringify())實(shí)現(xiàn)深拷貝,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • js+json用表格實(shí)現(xiàn)簡單網(wǎng)站左側(cè)導(dǎo)航

    js+json用表格實(shí)現(xiàn)簡單網(wǎng)站左側(cè)導(dǎo)航

    閑暇之余,制作一用表格實(shí)現(xiàn)的簡單的網(wǎng)站導(dǎo)航條,分享給大家。這里的數(shù)據(jù)基于json格式,學(xué)習(xí)json的朋友可以參考下。
    2010-04-04
  • Chrome中JSON.parse的特殊實(shí)現(xiàn)

    Chrome中JSON.parse的特殊實(shí)現(xiàn)

    ECMA 262 Edition5 中提供了原生的JSON支持,其中JSON.parse用來將字符串轉(zhuǎn)成成json,見ECMA 262 Edition5 15.12.2。另見:字符串轉(zhuǎn)換成json的三種方式
    2011-01-01
  • JSON.parse()方法轉(zhuǎn)換對象的示例以及注意事項

    JSON.parse()方法轉(zhuǎn)換對象的示例以及注意事項

    這篇文章主要介紹了JSON.parse()方法轉(zhuǎn)換對象的示例以及注意事項,我們可以使用 JSON.parse() 方法將數(shù)據(jù)轉(zhuǎn)換為 JavaScript 對象,需要的朋友可以參考下
    2023-05-05
  • 最新評論