我有一个ASP.NET MVC 4应用程序,其中我在会话超时过滤器处理程序中捕获会话超时以处理会话超时。我还想处理ajax请求的会话超时。我最初实现了我在question here中找到的代码。
最初用于自动填充和其他ajax调用的处理,但唯一的问题是ajax调用模态弹出窗口!
所以现在我已经将会话超时处理程序更改为:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Session != null)
{
if (filterContext.HttpContext.Session.IsNewSession)
{
var sessionStateDetails =(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"];
if ((sessionCookie != null) && (sessionCookie.IndexOf(sessionStateDetails.CookieName) >= 0))
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 500;
即。将状态代码设置为500(401对我没有用,因为我正在使用Windows身份验证和模拟,所以如果我将状态更改为401,我会获得密码和用户名的安全弹出窗口。)
然后我将其捕获到.ajaxSetup或.ajaxError中我已经尝试了两个...并重新指向我的会话超时操作(根据需要)以显示具有会话超时的视图。
$(document).ajaxError(function (xhr, props) {
if (props.status === 500) {
////session redirect goes here
var pathArray = window.location.pathname.split('/');
var segment_1 = pathArray[1];
var newURL = window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/SessionTimeout";
window.location = newURL;
}
});
问题出在重定向之前,ajax弹出窗口仍然是短暂打开的。所以它看起来不太棒。知道我怎么能阻止它开放并顺利重新指挥?
这是我的jQuery对话框代码:
$(document).ready(function () {
$(".openDialog").live("click", function (e) {
e.preventDefault();
$("<div></div>")
.addClass("dialog")
.attr("id", $(this)
.attr("data-dialog-id"))
.appendTo("body")
.dialog({
title: $(this).attr("data-dialog-title"),
close: function () { $(this).remove() },
width: 600,
modal: true,
height: 'auto',
show: 'fade',
hide: 'fade',
resizable: 'false'
})
.load(this.href);
});
$(".close").live("click", function (e) {
e.preventDefault();
$(this).closest(".dialog").dialog("close");
});
});
任何帮助都会受到赞赏,我想我几乎就是这样。
答案 0 :(得分:2)
我设法让这个工作最终,如果其他人有同样的问题,这就是我做的...我继续使用会话处理程序,但我现在提高403而不是500,因为提高500显然是错误的并且有一些不良副作用:
来自
的代码 if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.StatusCode = 403;
}
else ...usual code goes here ....
然后我捕获ajax错误如下:
$(document).ajaxError(function (xhr, props) {
if (props.status == 403 ) {
////session redirect goes here
var pathArray = window.location.pathname.split('/');
var segment_1 = pathArray[1];
var newURL = window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/SessionTimeout";
window.location = newURL;
}
});
当然,我的弹出窗口仍会尝试在重新指示之前加载最短暂的时刻,但我的用户似乎并不介意。
答案 1 :(得分:0)
删除覆盖public override void OnActionExecuting(ActionExecutingContext filterContext)
并使用(在global.asax中):
protected void Application_EndRequest(object sender, EventArgs args)
{
HttpContextWrapper context = new HttpContextWrapper(Context);
if (context.Response.StatusCode == 302 && context.Request.IsAjaxRequest())
context.Response.RedirectLocation = string.Empty;
//MiniProfiler.Stop();
}
并在您的JavaScript中:
$.ajaxSetup({ //jQuery.ajaxSetup({
statusCode: {
302: function () {
__userLoginEvent = true;
}
}
});
$(document).ajaxStop(function () {
if (__userLoginEvent) {
//your redirection here
__userLoginEvent = false;
}
})
我使用ajaxStop
因为如果您是多个ajax调用,则需要一个重定向。这对我来说很完美。