ActionFilter 不适用于 AJAX 调用

Posted

技术标签:

【中文标题】ActionFilter 不适用于 AJAX 调用【英文标题】:ActionFilter is not working with AJAX call 【发布时间】:2021-08-13 02:15:23 【问题描述】:

我有一个对 DataTable 的 AJAX 调用,该调用在我的控制器中调用一个返回类型为 JsonResult 的方法。如果用户的会话已过期,我会收到 JSON 错误警报,并且网站会挂起。我正在尝试使用 ActionFilter 在处理请求之前检查用户的会话是否已过期。它在方法返回类型为 ActionResult 时起作用。但是,当返回类型为 JsonResult 时,我看到错误并挂起。跟踪时,我看到正在调用 ActionFilter 并且代码工作正常,但它不会像应有的那样将用户重定向到登录页面。有没有办法在服务器端中止 AJAX 调用并按预期重定向用户?

动作过滤器

public override void OnActionExecuting(ActionExecutingContext filterContext)
        
            HttpContext ctx = HttpContext.Current;
            if (ctx.Session != null)
            
                if (ctx.Session.IsNewSession)
                
                    string cookieHeaders = ctx.Request.Headers["Cookie"];

                    if ((null != cookieHeaders) && (cookieHeaders.IndexOf("ASP.NET_SessionId") >= 0))
                    
                        filterContext.Result = new RedirectResult("~/Account/Login");
                        return;
                    
                
            
            base.OnActionExecuting(filterContext);
        

【问题讨论】:

【参考方案1】:

我们可以检查请求是否是 Ajax 然后返回 json 结果并在客户端检查服务器是否返回错误重定向到登录页面,如:

if ((null != cookieHeaders) && (cookieHeaders.IndexOf("ASP.NET_SessionId") >= 0))

    if (filterContext.HttpContext.Request.IsAjaxRequest())
    
            
          filterContext.Result = new JsonResult
          
              Data = new Error = "UnAutorized", Url = Url.Action("Login","Account"),
              JsonRequestBehavior = JsonRequestBehavior.AllowGet
          ;

          return;
     
     else
     
         filterContext.Result = new RedirectResult("~/Account/Login");
         return;
     

现在对于正常请求,它将重定向到登录页面,对于 ajax 调用,将重新发送带有未经授权的错误消息和 URL 的 json 响应,然后在客户端我们可以像这样重定向:

window.location.href = response.Url;

【讨论】:

我不知道有一个 IsAjaxRequest 方法!我稍微调整了 JsonResult,但这解决了我的问题!非常感谢Ehsan!我已经解决这个问题两天了。

以上是关于ActionFilter 不适用于 AJAX 调用的主要内容,如果未能解决你的问题,请参考以下文章

WCF Ajax 调用不适用于 Jquery $.ajax

数据表不适用于ajax调用

Ajax POST 调用不适用于 WCF

wordpress 中的 Ajax 调用不适用于前端站点的订阅者用户

Ajax 调用仅适用于表的第一行,不适用于下一行

CORS 不适用于从 Ajax 到 ASP.NET Core Web API 的调用