轉(zhuǎn)帖|其它|編輯:郝浩|2011-04-18 14:08:53.000|閱讀 1042 次
概述:在信息系統(tǒng)開發(fā)的時,根據(jù)相關(guān)業(yè)務(wù)邏輯難免會多系統(tǒng)之間互相登錄。一般情況下我們需要在多系統(tǒng)之間使用多個用戶名和密碼。這樣客戶就需要在多個系統(tǒng)之間重復(fù)登陸。每次登錄都需要輸入用戶名和密碼。最近比較流行的就是OAuth。新浪微博這個開放系統(tǒng)做的就很好。但OAuth并非本文討論范疇。這里主要討論jQuery1.5 jsonp 在Asp.net MVC3 中的應(yīng)用。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在信息系統(tǒng)開發(fā)的時,根據(jù)相關(guān)業(yè)務(wù)邏輯難免會多系統(tǒng)之間互相登錄。一般情況下我們需要在多系統(tǒng)之間使用多個用戶名和密碼。這樣客戶就需要在多個系統(tǒng)之間重復(fù)登陸。每次登錄都需要輸入用戶名和密碼。最近比較流行的就是OAuth。新浪微博這個開放系統(tǒng)做的就很好。但OAuth并非本文討論范疇。這里主要討論jQuery1.5 jsonp 在Asp.net MVC3 中的應(yīng)用。
本文應(yīng)用場景:
假設(shè)您的開發(fā)團隊欲為某集團公司開發(fā)一整套信息管理系統(tǒng),目前首要開發(fā)的就是一套訂單系統(tǒng)和一套內(nèi)部OA系統(tǒng)。前提是這兩套系統(tǒng)使用同一套數(shù)據(jù)庫。只是兩個不同的MVC3.0 Web項目。也就是說會在同一個IIS上部署兩個虛擬目錄。 我們的目標是在不使用WCF、WebService 等技術(shù)實現(xiàn)跨域登錄。也就是說用戶用同一個帳號登錄了訂單系統(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("程序出錯,請聯(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ù)器端的原理其實就是回調(diào)一個js函數(shù)名(這里是callback參數(shù))將該參數(shù)傳給服務(wù)端,接著再由服務(wù)器端執(zhí)行這個callback js函數(shù), 同時附上該js函數(shù)的參數(shù)。比如上文的C#代碼: var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")";還有一點我們要注意的就是安全隱患問題:在使用jsonp由于涉及到跨域,需要考慮到對方站點或者對方系統(tǒng)的安全性問題。應(yīng)當(dāng)避免安全隱患,不能濫用jsonp。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載