菜鳥プログラマーのAsp.NetMVCセッション期限切れ異常の処理

7294 ワード

趙さんは卒業したばかりのコンピューター専攻の大学生で、4年間の大学の時間の中で、プログラミングのデータをたくさん読んで、コードもたくさん手に入れました.今卒業して、彼は願い通りT会社に入社して、自分のプログラマー生活を始めました.彼は自信満々で、自分の4年間の勉強したことを信じて、きっと仕事で役に立つことができて、自分のすぐに今の仕事に適任することを助けることができます.
目次を読む:
一、Sessionによる異常
二、MVCの中のFilterを使ってSessionを検証する
三、Ajax要求の中で、Sessionが失効する処理
四、Sessionの期限切れ異常の処理の重要性

一、Sessionによる異常


趙さんは会社に入ったばかりで、実際のプロジェクトに参加しました.プロジェクトはAspを使っています.net MVC.約2週間かけて、趙さんはすべての機能を完成し、QAテストに提出しました.
ある日、QAはテストの結果を送って、趙さんは一度やって、自分が作ったものを発見して、中には問題がこんなに多いことに気づいた.
1つのバグは次のとおりです.
Firefoxを使用してシステムにログイン後、Tabを1つ開き、システムページに入り、logoutをクリックします.前のtabページに戻り、Saveボタンをクリックするとjsエラーが発生しました.この場合、ユーザーをログインページに移動する必要があります.
趙さんはこのバグを見て呆然としたが、QAがこのような「暴力」で自分のプログラムをテストするとは思わなかった.別のタブでlogoutをクリックすると、セッションが空になり、最初のタブのSaveボタンをクリックすると、呼び出されたAjaxメソッドに異常が発生します.
しかし、このような「非正常」操作による異常をどのように処理するのか.
 

二、MVCの中のFilterを使ってSessionを検証する


趙さんは資料を調べたところ、MVCのAuthorizationFilterが実際にControllerにアクセスする前に、リクエストをブロックできることが分かった.この時、ここでSessionの有効性をチェックすることができ、Sessionが失効したことを発見したら、ユーザーをログインページに移すことができる.(MVCフィルタについてはここ)
[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リクエストでセッションが期限切れになった場合、上記の方法では効果が得られません.実現の構想は,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の期限切れ異常の処理の重要性


正直に言うと、開発者がプロジェクトを開始するとき、コード実装の機能、すなわちプログラムの「正常」な動作時の状態に注目することが多いが、「非正常」の場合、考慮することは少ない.これらの方面の考慮に対して、やっと私たちをもっと専門的なプログラマーになって、菜鳥の立場から抜け出すことができます.