2010-07-27 3 views
2

표준 HTML 양식에서 정상적으로 작동하는 내 .Net MVC 응용 프로그램의 만료 된 세션을 확인하는 고객 필터 속성이 있습니다. 그러나 Ajax 폼에 의해 호출 된 액션에 속성을 적용하고 세션이 만료되면 로그인 페이지 (필터 속성이 컨텍스트를 리디렉션하는 위치)를 Ajax 업데이트 컨테이너로 다시로드합니다. 누군가가 ajax 호출이 만료 될 때 세션이 만료되거나 누구든지이 상황을 좀 더 우아하게 처리하는 방법을 알고 있다면 로그인 페이지로 리디렉션하는 전체 페이지를 가져 오는 방법을 알고 있습니까? 미리 감사드립니다..net mvc & ajax forms - 세션 만료 처리 방법

public class SessionExpiredFilterAttribute : ActionFilterAttribute 
    { 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      HttpContext ctx = HttpContext.Current; 

      // check if session is supported 
      if (ctx.Session != null) 
      { 

       // check if a new session id was generated 
       if (ctx.Session.IsNewSession) 
       { 

        // If it says it is a new session, but an existing cookie exists, then it must 
        // have timed out 
        string sessionCookie = ctx.Request.Headers["Cookie"]; 
        if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0)) 
        { 
         //SessionHelper.AddPageMessage("message", "Your session has expired. Please login to continue"); 
         ctx.Response.Redirect("~/Account/Logon"); 
        } 
       } 
      } 


      base.OnActionExecuting(filterContext); 
     } 
    } 
+1

나는 이것에 대한 답변을 찾고 있습니다. – CedricB

답변

0

나는이 문제에 대한 원래 질문을 게시했으며 마침내 해결 방법을 찾았다 고 생각합니다. 내가 기대했던 것만 큼 우아하지는 않지만, 그것은 작동합니다 (이것은 지금까지 발견 한 것 이상입니다). 이 솔루션은 OnBegin AjaxOption과 일부 Jquery 주위에 있습니다. 내 ActionLink (또한이에 적용하고 있음을 Ajax.BeginForm 수는) 내 경우에는 내가 그렇게 사용자 개체를 저장하고, 세션을 확인 내 계정 컨트롤러에서 컨트롤러 액션이이

<%= Ajax.ActionLink("Do Ajax Function", "AjaxAction", new { }, new AjaxOptions { OnBegin="check_session", OnSuccess = "ajaxSuccess", UpdateTargetId = "update_container"}, new { })%> 

처럼 보인다 null인지 확인하고 'True'또는 'False'를 내용으로 반환합니다. OutputCache가 중요하지 않으면 결과가 캐싱됩니다.

[OutputCache(Duration=0, VaryByParam="None")] 
     public ActionResult CheckAjaxSessionExpired() 
     { 

      bool _sessionExpired = false; 
      if (Session["User"] == null) 
      { 
       _sessionExpired = true; 
      } 

      return Content(_sessionExpired.ToString()); 
     } 

마지막 부분은 OnBegin 핸들러로 지정된 check_session 함수이다. Jquery ajax 호출은 세션 검사 동작을 수행하고 응답을 확인합니다. 응답이 '참'(세션이 만료되었음을 의미) 인 경우 페이지의 위치가 다시 홈 페이지 (또는이 경우 google)로 설정됩니다.

function check_session(){ 

     var url = '<%= Url.Action("CheckAjaxSessionExpired", "Account") %>'; 


     //GET CHECK SESSION 
     $.ajax({ 
      url: url, 
      success: function(data) { 

       //alert(data); 

       if (data == "True"){ 
        document.location = "http://www.google.com"; 
       } 
      }, 
      error: function() { alert("there was a problem loading the ajax session check"); } 
     }); 
    } 

이 방법을 사용하는 경우 기억해야 할 몇 가지 사항이 있습니다. 첫 번째는 비동기 적으로 실행된다는 것입니다. 호출중인 데이터에 민감한 코드가있는 경우 세션에서 서버 측 검사를 수행해야합니다. 이 코드는 ajax 호출 중에 세션이 만료되면 로그인 페이지 (또는 홈 페이지)로 간단히 리디렉션하기위한 것입니다. 두 번째로 check_session 함수를 모든 Ajax 호출의 OnBegin 이벤트에 연결해야합니다. 누군가이 방법을 개선하기위한 조언이나 제안 사항이 있으면 그 내용을 듣고 싶습니다. 나는 이것이 누군가를 돕기를 바랍니다.