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

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

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

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

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

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

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

JSONP(JSON with Padding)是JSON的 一種“使用模式”,可用于解決主流瀏覽器的跨域數(shù)據(jù)訪問的問題。由于同源策略,一般來說位于 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 解析器解析。

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

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

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

前端代碼:

復制代碼 代碼如下:

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代碼:

復制代碼 代碼如下:

[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è)務操作,可返回自己的任意信息(多數(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服務GetSingleInfo方法,后臺的GetSingleInfo方法,使用前端的回調(diào)方法OnGetMemberSuccessByjsonp包裝后臺的業(yè)務操作的JSON對象,返回給前端一段javascript片段執(zhí)行。巧妙的解決了跨域訪問問題。

JSONP的缺點:

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

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

相關文章

  • js中將字符串轉換成json的三種方式

    js中將字符串轉換成json的三種方式

    使用ajax的開發(fā)項目過程中,經(jīng)常需要將json格式的字符串返回到前端,前端解析成js對象(JSON )。
    2011-01-01
  • 使用Json比用string返回數(shù)據(jù)更友好,也更面向對象一些

    使用Json比用string返回數(shù)據(jù)更友好,也更面向對象一些

    在面向對象的程序來講,它的可能性,編寫代碼不易出錯率也很重要,所以,建議在返回復雜字條符時,使用C#提供的Json,而不需要自己去拼寫JS返回的Json格式。
    2011-09-09
  • ASP Json Parser修正版

    ASP Json Parser修正版

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

    簡明json介紹

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論