在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