2016-07-18 84 views
1

我製作了一個過濾器,它將會話變量的值設爲null。 如果它沒有值,那麼我重定向到登錄頁面。 該過濾器的代碼,如果喜歡 -重定向到特定控制器/操作方法從操作篩選器屬性

public class AuthorizerActionFilter : ActionFilterAttribute , IActionFilter 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.HttpContext.Request.IsAjaxRequest()) 
     { 
      if (HttpContext.Current.Session != null) 
      { 
       if (HttpContext.Current.Session["UserInfo"] == null) 
       { 
        filterContext.Result = new RedirectToRouteResult(
          new RouteValueDictionary {{ "Controller", "UserLogin" }, 
                 { "Action", "UserLogin" } }); 
       } 
      } 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

我註冊這個過濾器進入的Global.asax喜歡但─

GlobalFilters.Filters.Add(new AuthorizerActionFilter()); 

在我的應用的每個請求首先進入到這個過濾器。 當我第一次運行我的應用程序時,此過濾器運行兩次並打開登錄頁面,但它沒有從過濾器重定向,因爲它不是ajax請求。 我填寫登錄憑證,當我點擊登錄時,ajax請求首先進入此過濾器。 這是我的問題,這次沒有任何事情發生。我的意思是當我調試AuthorizerActionFilter過濾器代碼時,這個過濾器一次又一次地運行。爲什麼會發生在重定向Controller-Action時是否有任何問題?

回答

0

問題是,您將獲得無限數量的請求處理。當你的ajax調用完成後,你的過濾器將返回新地址UserLogin\UserLogin(這是一個ajax調用)的響應。如果你在你的過濾器中放置一個斷點,你會發現它會被無限次地擊中!

你應該更新你的客戶端&服務器端代碼做一個非ajax重定向到UserLogin。

首先,對於ajax請求,你應該考慮發送一個json響應。

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.HttpContext.Request.IsAjaxRequest()) 
    { 
     if (HttpContext.Current.Session != null) 
     { 
      if (HttpContext.Current.Session["UserInfo"] == null) 
      { 

       var url = new UrlHelper(filterContext.Controller.ControllerContext 
             .RequestContext).Action("UserLogin", "UserLogin"); 
       filterContext.HttpContext.Response.StatusCode = 401; 
       filterContext.Result = new JsonResult { Data = new { LoginUrl = url }; 
      } 
     } 
    } 
    base.OnActionExecuting(filterContext); 
} 

而在你的JavaScript中,有一個全球性的ajaxComplete在您檢查狀態屬性值,如果是401(這是我們在行動過濾器設置),重定向○LoginUrl屬性值。

$(document).ajaxComplete(function (a, xhr, c) { 
    if (xhr.status === 401) { 
     var d = $.parseJSON(xhr.responseText); 
     window.location.href = d.LoginUrl; 
    } 
}); 
+0

當有一個ajax調用只有那麼我必須檢查有關會議有一定的價值。如果它沒有值,那麼我必須重定向到用戶登錄控制器和用戶登錄操作。 –

+0

看看我更新的答案,它處理ajax請求場景 – Shyju

+0

是不是可以直接從過濾器重定向任何控制器/動作? –

相關問題