在ASP.NET MVC3 中利用JSONP跨域登陸WEB系統

    在信息系統開發的時,根據相關業務邏輯不免會多系統之間互相登陸。通常狀況下咱們須要在多系統之間使用多個用戶名和密碼。這樣客戶就須要在多個系統之間重複登錄。每次登陸都須要輸入用戶名和密碼。最近比較流行的就是OAuth。新浪微博這個開放系統作的就很好。但OAuth並不是本文討論範疇。這裏主要討論jQuery1.5 jsonp 在Asp.net MVC3 中的應用。javascript

    本文應用場景:html

        假設您的開發團隊欲爲某集團公司開發一整套信息管理系統,目前首要開發的就是一套訂單系統和一套內部OA系統。前提是這兩套系統使用同一套數據庫。只是兩個不一樣的MVC3.0 Web項目。也就是說會在同一個IIS上部署兩個虛擬目錄。  咱們的目標是在不使用WCF、WebService 等技術實現跨域登陸。也就是說用戶用同一個賬號登陸了訂單系統,那麼客戶就能夠直接登陸OA系統。而不須要在OA系統上再輸入一次用戶名和密碼。反之亦成立。java

    jQuery1.5 JSONP 使用:jquery

< script type = " text/javascript " >
2 $( function () {
3 var oAUri = " @ViewBag.OAVRUri " ;
4 var user = " @ViewBag.User " ;
5 var pwd = " @ViewBag.PassWord " ;
6
7 $.ajax({
8 type: " GET " ,
9 url: String.format( ' {0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=? ' , oAUri, user, pwd),
10 cache: false ,
11 error: function () {
12 alert( " 程序出錯,請聯繫管理員. " );
13 },
14 dataType: " jsonp " ,
15 jsonp: ' callback ' ,
16 success: function (result) {
17
18 }
19 });
20
21 });
22 < / script>


   在MVC3.0中創建JSONP專用ActionResultajax

      代碼以下:
數據庫

1 public class JsonpResult < T > : ActionResult
2 {
3 public T Obj { get ; set ; }
4 public string CallbackName { get ; set ; }
5
6 public JsonpResult(T obj, string callback)
7 {
8 this .Obj = obj;
9 this .CallbackName = callback;
10 }
11
12 public override void ExecuteResult(ControllerContext context)
13 {
14 var js = new System.Web.Script.Serialization.JavaScriptSerializer();
15 var jsonp = this .CallbackName + " ( " + js.Serialize( this .Obj) + " ) " ;
16
17 context.HttpContext.Response.ContentType = " application/json " ;
18 context.HttpContext.Response.Write(jsonp);
19 }
20 }

JsonpResult 簡單調用以下:json

  public ActionResult AppLogOn( string UserName, string PassWord, string callback)
{
return new JsonpResult < object > ( new { success = true , rankName = rankName }, callback);
}
AppLogOn的action參數徹底和上文中的jquery $.ajax 參數一致: url: String.format( ' {0}Account/AppLogOn?UserName={1}&PassWord={2}&callback=? ' , oAUri, user, pwd)

小結:
Jsonp的服務器端的原理其實就是回調一個js函數名(這裏是callback參數)將該參數傳給服務端,接着再由服務器端執行這個callback js函數,
同時附上該js函數的參數。好比上文的C#代碼:
var jsonp = this.CallbackName + "(" + js.Serialize(this.Obj) + ")";還有一點咱們要注意的就是安全隱患問題:
在使用jsonp因爲涉及到跨域,須要考慮到對方站點或者對方系統的安全性問題。應當避免安全隱患,不能濫用jsonp。

原文連接: http://www.cnblogs.com/ryanding/archive/2011/04/08/2008628.html
相關文章
相關標籤/搜索