|
在信息系統(tǒng)開發(fā)的時(shí),根據(jù)相關(guān)業(yè)務(wù)邏輯難免會(huì)多系統(tǒng)之間互相登錄。一般情況下我們需要在多系統(tǒng)之間使用多個(gè)用戶名和密碼。這樣客戶就需要在多個(gè)系統(tǒng)之間重復(fù)登陸。每次登錄都需要輸入用戶名和密碼。最近比較流行的就是OAuth。新浪微博這個(gè)開放系統(tǒng)做的就很好。但OAuth并非本文討論范疇。這里主要討論jQuery1.5 jsonp 在Asp.net MVC3 中的應(yīng)用。
本文應(yīng)用場(chǎng)景:
假設(shè)您的開發(fā)團(tuán)隊(duì)欲為某集團(tuán)公司開發(fā)一整套信息管理系統(tǒng),目前首要開發(fā)的就是一套訂單系統(tǒng)和一套內(nèi)部OA系統(tǒng)。前提是這兩套系統(tǒng)使用同一套數(shù)據(jù)庫。只是兩個(gè)不同的MVC3.0 Web項(xiàng)目。也就是說會(huì)在同一個(gè)IIS上部署兩個(gè)虛擬目錄。 我們的目標(biāo)是在不使用WCF、WebService 等技術(shù)實(shí)現(xiàn)跨域登錄。也就是說用戶用同一個(gè)賬號(hào)登錄了訂單系統(tǒng),那么客戶就可以直接登錄OA系統(tǒng)。而不需要在OA系統(tǒng)上再輸入一次用戶名和密碼。反之亦成立。
jQuery1.5 JSONP 使用:
<script type="text/javascript"> $(function () { var oAUri = "@ViewBag.OAVRUri"; var user = "@ViewBag.User"; var pwd = "@ViewBag.PassWord";
$.ajax({ type: "GET", url: String.format('{0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=?', oAUri, user, pwd), cache: false, error: function () { alert("程序出錯(cuò),請(qǐng)聯(lián)系管理員."); }, dataType: "jsonp", jsonp: 'callback', success: function (result) {
} });
}); </script>
在MVC3.0中建立JSONP專用ActionResult。
代碼如下:
public class JsonpResult<T> : ActionResult { public T Obj { get; set; } public string CallbackName { get; set; }
public JsonpResult(T obj, string callback) { this.Obj = obj; this.CallbackName = callback; }
public override void ExecuteResult(ControllerContext context) { var js = new System.Web.Script.Serialization.JavaScriptSerializer(); var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")";
context.HttpContext.Response.ContentType = "application/json"; context.HttpContext.Response.Write(jsonp); } }
JsonpResult 簡單調(diào)用如下:
public ActionResult AppLogOn(string UserName, string PassWord, string callback) { return new JsonpResult<object>(new { success = true, rankName = rankName }, callback); }
AppLogOn的action參數(shù)完全和上文中的jquery $.ajax 參數(shù)一致:
url: String.format('{0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=?', oAUri, user, pwd)
小結(jié):
Jsonp的服務(wù)器端的原理其實(shí)就是回調(diào)一個(gè)js函數(shù)名(這里是callback參數(shù))將該參數(shù)傳給服務(wù)端,接著再由服務(wù)器端執(zhí)行這個(gè)callback js函數(shù), 同時(shí)附上該js函數(shù)的參數(shù)。比如上文的C#代碼: var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")";還有一點(diǎn)我們要注意的就是安全隱患問題:在使用jsonp由于涉及到跨域,需要考慮到對(duì)方站點(diǎn)或者對(duì)方系統(tǒng)的安全性問題。應(yīng)當(dāng)避免安全隱患,不能濫用jsonp。
|