在ajax调用中处理会话超时

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请求中被调用。 我在里面看到一个带有主屏幕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方法中告诉我会话超时了吗?


一个好的起点可能是:

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

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

如果不是,你可以尝试:

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

查看e&xhr属性并从那里做出决定。

链接地址: http://www.djcxy.com/p/71795.html

上一篇: Handling session timeouts in ajax calls

下一篇: How to handle session timeout error on ajax call in asp.net mvc3