Asp.net MVC Session到期異常的處理

來源:互聯網
上載者:User
一, Session引發的異常

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

過了一天,QA發回了測試結果,小趙過了一遍,發現原來自己做的東西,裡面問題這麼多。

其中一個bug是這樣的 :

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

小趙看到這個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;                      }        }});    

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.