处理ajax调用中的会话超时

时间:2016-08-18 13:42:35

标签: ajax asp.net-mvc session

ASP.Net MVC 5 .Net Framework 4.6.1

我刚刚添加了代码来检测会话超时,但工作正常:

     public class CheckSessionTimeOutAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
    {
        var context = filterContext.HttpContext;
        if (context.Session != null)
        {
            if (context.Session.IsNewSession)
            {
                string sessionCookie = context.Request.Headers["Cookie"];
                if ((sessionCookie != null) && (sessionCookie.IndexOf("ASP.NET_SessionId", StringComparison.Ordinal) >= 0))
                {
                    string redirectTo = "~/Home/Index";
                    filterContext.HttpContext.Response.Redirect(redirectTo, true);
                }
            }
        }
        base.OnActionExecuting(filterContext);
    }
}

如您所见,我将它们重定向到主屏幕。我将[CheckSessionTimeOut]作为所有相关控制器的属性。因此,我运行应用程序,转到主屏幕以外的页面,等待1分钟进行会话超时,代码在某些情况下按预期运行。案例和点,我有一个下拉列表,当做出选择时,正在进行重定向。继承人的方法:

   $('#selusers').change(function () {
    var rd = $(this).find("option:selected").attr('redirect');
    location.href = rd;
});

此处发生的情况是,从下拉列表中选择用户时,将读取重定向属性并重定向到该人员。如果会话超时,则会重定向到登录用户,而不是新选择的用户。这对我的应用来说是正确的。

但是,我在我的应用程序中进行了大量的ajax调用。当会话超时并且我点击一个触发ajax调用的元素时,我被重定向到主屏幕,但是在ajax请求中调用了error方法。我得到一个主屏幕html弹出窗口。这是我正在制作的ajax调用的一个例子。我在一个带有保存按钮的屏幕上,会话超时并且此代码被触发:

    SaveButtonClicked: function (somedata) {
            $.ajax({
                url: url,
                type: 'POST',
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(some data im sending),
                success: function (dataResult) {
                        if (!dataResult.Ok) {
                            alert("Error occurred. Please try again");
                        }
                },
                error: function (err) {
                    alert(err.responseText);//this gets called
                }
            });
        }

我已覆盖默认提醒,因此会显示样式的html。警报框中包含主屏幕html。我不要那个。我想将应用程序重定向到主屏幕,没有弹出窗口。所以我的第一个问题是,有没有办法在服务器上做一些事情来阻止ajax调用运行其完整的方法(即我想在服务器上做一些事情,所以ajax调用的成功,错误或完整的方法永远不会被调用)?下一个问题,如果第一个问题不是一个选项,那么在ajax调用的完整方法中检测到会话超时的非常好的方法是什么,以便用户被优雅地重定向到主屏幕?如果还有其他方法可以实现我想要实现的目标,我也不会问,请分享。感谢您阅读我的问题。

更新的 我从我的一个ajax调用中删除了错误函数,并添加了一个全局错误处理程序:

   $(document).ajaxError(function (e, xhr, settings) {
        debugger;
     });

现在,当会话超时时,会调用此错误处理程序,但是,我查看xhr变量,它包含ajax调用的结果和相应的html。状态是200,statusText表示parsererror,readystate是4.这里没有任何东西告诉我会话超时。我可以在全局ajaxError方法中告诉我会话超时吗?

1 个答案:

答案 0 :(得分:0)

一个好的起点可能是:

如果您的ASP.NET MVC项目正确返回状态代码:

$.ajaxSetup({
    statusCode: {
        401: function() {
            window.location.href = "/login/path";
        }
    }
});

如果没有,你可以尝试:

$(document).ajaxError(function (e, xhr, settings) {
    debugger;
});

回顾e& xhr属性并从那里做出决定。