菜鳥程序員之Asp.net MVC Session過時異常的處理

小趙是剛畢業的計算機專業方面的大學生,4年的大學時間裏面,他讀過了不少編程方面的數據,也動手也了不少代碼。如今畢業了,他如願的加入了T公司,開始了本身的程序員生涯。他信心滿滿,相信本身4年的學習到的東西,必定可以在工做派上用場,幫助本身很快的勝任如今的工做。html

閱讀目錄:程序員

1、Session引起的異常ajax

2、使用MVC中的Filter來對Session進行驗證編程

3、對於Ajax請求的中,Session失效的處理session

4、處理Session過時異常的重要性ide

一, Session引起的異常

小趙剛進公司,就參與到了一個實際的項目中了,項目使用的是Asp.net MVC。花了大概2個周的時間,小趙就完成了全部功能,提交給QA測試了。學習

過了一天,QA發回了測試結果,小趙過了一遍,發現原來本身作的東西,裏面問題這麼多。測試

其中一個bug是這樣的:url

使用Firefox登陸進入系統後,再打開一個Tab,進入系統頁面,點擊logout. 在回到前一個tab頁面,點擊Save按鈕,出現了js錯誤。這個時候應當將用戶轉到登錄頁。spa

小趙看到這個bug,有些目瞪口呆,沒想到QA用這麼"暴力"的方式來測試本身的程序。在另外一個Tab上點擊logout, 會致使session清空的,這樣再點擊第一個tab上的Save按鈕,調用的Ajax方法會出現異常的。

可是如何處理這種」非正常」操做引起的異常呢?

 

二,使用MVC中的Filter來對Session進行驗證

小趙查了查資料,發現MVC中的AuthorizationFilter可以在實際訪問Controller前,攔截請求,這個時候在這裏能夠對Session的有效性進行檢查,若是發現Session失效了,就把用戶轉向登錄頁。(關於MVC filter能夠點這裏)

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
      public void OnAuthorization(AuthorizationContext filterContext)
      {
           var loginUser = filterContext.HttpContext.Session["User"];
           //When user has not login yet
           if (loginUser == null)
           {
               var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;
               filterContext.Result = new RedirectResult(redirectUrl);
               return;
           }

      }
}

三,對於Ajax請求的中,Session失效的處理

Ajax請求中,若是遇到session過時,使用上面的方法是不可以達到效果的。實現的思路是,若是發現是Ajax請求,就返回特定格式的Json數據,客戶端對於這個數據進行處理,發現有Session失效的狀況,就跳轉到登陸頁面。

首先,擴展咱們的MyAuthorizeAttribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class MyAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
      public void OnAuthorization(AuthorizationContext filterContext)
      {
           var loginUser = filterContext.HttpContext.Session["User"];
           //When user has not login yet
           if (loginUser == null)
           {
               var redirectUrl = ConstantProvider.LoginURL + "?RedirectPath=" + filterContext.HttpContext.Request.Url;                
               if(!filterContext.HttpContext.Request.IsAjaxRequest())
               {
                   filterContext.Result = new RedirectResult(redirectUrl);
               }
               else
               {
                  filterContext.Result = new JsonResult
                                         {
                                               Data = new
                                               {
                                                   Success = false,
                                                   Message = string.Empty,
                                                   Redirect = redirectUrl
                                         }
               };
           }
           return;
      }
}

上面判斷若是請求是來自於Ajax, 就返回一個Json Result,客戶端處理的代碼以下:

 $.ajax({
            type: "POST",
            url: "@Url.ContactInfoAjax()",
            success: function (msg) {
                      if (msg.Success) {
                              …….                 
                      }
                      if (msg.Redirect) {
                         window.location = msg.Redirect;
                      }
        }
});     

四, 處理Session過時異常的重要性

說實話,開發人員開始項目的時候,每每關注在代碼實現的功能上面,也就是程序"正常"工做時候的狀態關注的更多,而對於"非正常"狀況下,考慮的不多。而對於這些方面的考慮,才能讓咱們成爲更加專業的程序員,擺脫菜鳥的處境。

相關文章
相關標籤/搜索