6

所有,如果在会话超时时进行 ajax 调用,我会尝试重定向到登录页面。这是我到目前为止所做的。

为所有操作定义一个操作过滤器。

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" } });
                }
            }
        }
    }

这适用于会话超时时的非 ajax 操作调用。但是对于ajax调用。它不能不重定向到登录页面而只返回一个html页面字符串(似乎是登录页面的源html代码),而不是真正的结果。假设我们有这样的代码。

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);
            }
        });
    }

任何人都可以帮我解决这个问题吗?谢谢。

更新

根据 Mohsin 和 Dave 的回答(谢谢你们两个),这是最终的解决方案。请审查它。谢谢。

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" } });
                    }
                }
            }
        }
    }

在客户端:

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);
            }
        });
    }
4

1 回答 1

9

Ajax 调用不能返回任何类型的重定向。AJAX 调用的核心只返回一个字符串。没有可以执行重定向的引擎。

您可以执行客户端重定向。如果会话超时并且在客户端让您的控制器方法返回 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 });
      }

在您的 AJAXerror函数中:

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

旁注:您的目的地是“/Login/Login”还是“/Account/Login”

于 2013-02-21T12:31:04.413 回答