2013-02-21 53 views
6

Tất cả, tôi đang cố chuyển hướng đến trang đăng nhập nếu thực hiện cuộc gọi ajax khi hết giờ phiên. Đây là những gì tôi đã làm cho đến nay.Cuộc gọi Ajax khi hết giờ

Xác định bộ lọc hành động cho tất cả tác vụ.

public class AuthenticateFilterAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      base.OnActionExecuting(filterContext); 
      var routeDataSet = filterContext.RouteData; 
      if (LoginUser.LoginAdministrator == null) 
      { 
       //if the useinfo stored in session is timeout. 
       if (routeDataSet != null 
        && routeDataSet.Values["controller"] != null 
        && routeDataSet.Values["controller"].ToString().ToLower().Equals("login") 
        && routeDataSet.Values["action"] != null 
        && routeDataSet.Values["action"].ToString().ToLower().Equals("login")) 
       { 
        //if it is login action itself.let it be. don't do anything. 


       } 
       else 
       { 
        //redirect to login page. 
        filterContext.Result = new RedirectToRouteResult(
         new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } }); 
       } 
      } 
     } 
    } 

Thao tác này không hoạt động khi hết thời gian phiên. Nhưng đối với cuộc gọi ajax. Nó không thể chuyển hướng đến trang đăng nhập nhưng chỉ trả lại một chuỗi trang html (có vẻ như nó là mã nguồn html cho trang đăng nhập), không phải là kết quả thực sự. Giả sử chúng ta có mã như thế này.

function ajaxGetLogDetail(logId) { 
     var sUrl = "/LogDetail/index?logId=" + logId; 
     $.ajax({ 
      cache: false, 
      type: "GET", 
      async: false, 
      url: sUrl, 
      success: function (result) { 
       //please note result is html string. not the really result. 
      }, 
      error: function (xhr) { 
       alert(xhr.responseText); 
      } 
     }); 
    } 

Có ai giúp tôi một số đầu mối để giải quyết vấn đề này không? cảm ơn.

Cập nhật

Dựa trên của Mohsin và Dave câu trả lời (nhờ bạn hai), đây là cuối cùng giải pháp. Xin vui lòng xem lại nó. cảm ơn.

public class AuthenticateFilterAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      base.OnActionExecuting(filterContext); 
      var routeDataSet = filterContext.RouteData; 
      if (LoginUser.LoginAdministrator == null) 
      { 

       //&& routeDataSet != null && routeDataSet.Values["controller"] != null 
       //&& !routeDataSet.Values["controller"].ToString().ToLower().Equals("login") && routeDataSet.Values["action"] != null 
       //&& !routeDataSet.Values["action"].ToString().ToLower().Equals("login") && !filterContext.HttpContext.Request.HttpMethod.ToLower().Equals("get")) 
       if (routeDataSet != null 
        && routeDataSet.Values["controller"] != null 
        && routeDataSet.Values["controller"].ToString().ToLower().Equals("login") 
        && routeDataSet.Values["action"] != null 
        && routeDataSet.Values["action"].ToString().ToLower().Equals("login")) 
       { 



       } 
       else 
       { 
        if (filterContext.HttpContext.Request.IsAjaxRequest()) 
        { 
         filterContext.Result = new JsonResult 
         { 
          Data = new 
          { 
           ErrorMessage = "SystemSessionTimeOut" 
          }, 
          JsonRequestBehavior = JsonRequestBehavior.AllowGet 
         }; 
        } 
        else 
        { 
         filterContext.Result = new RedirectToRouteResult(
          new RouteValueDictionary { { "controller", "Login" }, { "action", "Login" } }); 
        } 
       } 
      } 
     } 
    } 

Về phía khách hàng:

function ajaxGetLogDetail(logId) { 
     var sUrl = "/LogDetail/index?logId=" + logId; 
     $.ajax({ 
      cache: false, 
      type: "GET", 
      async: false, 
      url: sUrl, 
      success: function (result) { 
       if (result.ErrorMessage=="SystemSessionTimeOut") 
       { 
        windows.location="/Login/Login"; 
       } 
       else 
       { 
        //... 
       } 
      }, 
      error: function (xhr) { 
       alert(xhr.responseText); 
      } 
     }); 
    } 
+1

bạn có thể kiểm tra loại yêu cầu bằng cách sử dụng IsAjaxRequest trong chế độ xem của bạn sau khi được chuyển hướng từ bộ lọc ở trên và trả lời tương ứng –

+0

Ý tưởng hay, Ý của bạn là 'f ilterContext.HttpContext.Request.IsAjaxRequest'? cảm ơn. –

+0

Xin chào, Mohsin, Dave đã cho tôi biết thêm chi tiết. Vì vậy, cách duy nhất để làm cho nó là thực hiện một chuyển hướng phía khách hàng. Tôi nghĩ rằng đó là một phần của ý nghĩa của bạn. –

Trả lời

7

cuộc gọi Ajax KHÔNG THỂ trả về một chuyển hướng của bất cứ loại nào. Tại lõi một cuộc gọi AJAX chỉ trả về một chuỗi. Không có Engine nào thuộc loại sẽ thực hiện chuyển hướng.

Bạn CÓ THỂ thực hiện chuyển hướng phía máy khách. Nếu đối tượng Session đã timed out và về phía khách hàng có phương pháp điều khiển của bạn trả về false:

 if !(routeDataSet != null 
     && routeDataSet.Values["controller"] != null 
     && routeDataSet.Values["controller"].ToString().ToLower().Equals("login") 
     && routeDataSet.Values["action"] != null 
     && routeDataSet.Values["action"].ToString().ToLower().Equals("login")) 
     { 
     return Json(new { success = false, message = errorMessage }); 
     } 

Trong chức năng AJAX error của bạn:

 error: function (xhr) { 
      alert(xhr.responseText); 
      window.location='/Login/Login'; 
     } 

Side lưu ý: được điểm đến của bạn có nghĩa là '/ Đăng nhập/Đăng nhập 'hoặc'/Tài khoản/Đăng nhập '

+0

Cảm ơn, Dave, bạn và Mohsin Akhtar đều có câu trả lời tốt. –

+0

Xin chào, Dave, Bạn có thể vui lòng xem lại nội dung cập nhật của tôi không. cảm ơn. –

Các vấn đề liên quan