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方法中告诉我会话超时吗?
答案 0 :(得分:0)
一个好的起点可能是:
如果您的ASP.NET MVC项目正确返回状态代码:
$.ajaxSetup({
statusCode: {
401: function() {
window.location.href = "/login/path";
}
}
});
如果没有,你可以尝试:
$(document).ajaxError(function (e, xhr, settings) {
debugger;
});
回顾e& xhr属性并从那里做出决定。