프로그래머의 Asp.net MVC 세션 만료 예외 처리

7322 단어 asp.net
샤오조는 갓 졸업한 컴퓨터 전공 분야의 대학생이다. 4년 동안 그는 프로그래밍 분야의 데이터를 많이 읽었고 코드도 많이 만들었다.지금은 졸업했고 그는 원하는 대로 T사에 입사해 프로그래머 생활을 시작했다.그는 4년 동안 배운 것이 반드시 일에 도움이 될 것이라고 믿고 현재의 일을 빨리 감당할 수 있도록 도와주었다.
목차를 읽습니다.
1. 세션이 일으킨 이상
2. MVC의 Filter를 사용하여 Session 검증
3. Ajax 요청의 경우 Session 무효 처리
4. 세션 만료 이상 처리의 중요성
하나, 세션이 일으킨 이상
조 군은 회사에 들어오자마자 실제 프로젝트에 참여했다. 프로젝트는 Asp를 사용했다.net MVC.조 군은 약 2주 만에 모든 기능을 완성해 QA 테스트에 제출했다.
하루가 지나자 QA가 테스트 결과를 보냈는데 조 군이 한 번 지나자 자신이 만든 물건이 이렇게 문제가 많은 것을 발견했다.
버그 중 하나는 다음과 같습니다.
Firefox를 사용하여 시스템에 로그인한 후 Tab을 열고 시스템 페이지에 들어가logout을 누르십시오.이전tab 페이지로 돌아가서 Save 단추를 누르면 js 오류가 발생합니다.이럴 때는 반드시 사용자를 로그인 페이지로 돌려야 한다.
조 군은 이 버그를 보고 어안이 벙벙해졌다. QA가 이렇게'폭력적'방식으로 자신의 프로그램을 테스트할 줄은 몰랐다.다른 탭에서 logout을 클릭하면session이 비워집니다. 이렇게 첫 번째 탭의 Save 단추를 누르면 호출된 Ajax 방법에 이상이 발생합니다.
그러나 이런 비정상적인 조작으로 인한 이상을 어떻게 처리합니까?
 
둘째, MVC의 Filter를 사용하여 Session 검증
조 군이 자료를 조사한 결과 MVC에 있는 AuthorizationFilter가 Controller에 실제로 접근하기 전에 요청을 차단할 수 있는 것을 발견했다. 이때 여기서 Session의 유효성을 검사할 수 있고 Session이 효력을 상실한 것을 발견하면 사용자를 로그인 페이지로 돌려보낼 수 있다.(MVC Filter에 대해서는 4여기. 클릭 가능)
[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이 효력을 상실한 상황을 발견하면 로그인 페이지로 넘어가는 것이다.
우선, MyAuthorize Attribute를 확장합니다.
[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;
                      }
        }
});     

넷째, 세션 만료 예외 처리의 중요성
솔직히 개발자가 프로젝트를 시작할 때 코드가 실현되는 기능, 즉 프로그램이 정상적으로 작업할 때의 상태에 더 많은 관심을 가지지만'비정상적인'상황에서 고려하는 것은 매우 적다.이런 부분에 대한 고려가 우리로 하여금 더욱 전문적인 프로그래머가 되어 풋내기의 처지에서 벗어나게 할 수 있다.

좋은 웹페이지 즐겨찾기