我有一个MVC应用程序,它使用大量的Ajax请求在页面上的div中获取和发布表单。但是我偶然发现了一个经典的Ajax超时问题,我通过创建一个自定义的Authorize属性修复了该问题,该属性只返回一个401允许我通过Jquery重定向到登录页面(此时一切都很好)。
public class AjaxAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Items["AjaxRequestPermissionDenied"] = true;
}
base.HandleUnauthorizedRequest(filterContext);
}
}
但是当我在会话过期时我正常服务器端提交表单时,我会被重定向到登录表单,但是在Url中有表单参数,即
Login/Login.aspx?ReturnUrl=%2fTest%2fComp%2fSite%2f4
。
因此,当我重新登录时,无法将表单插回到所需的div中,因为这是一个与最初调用它的页面不同的URL。
接下来的问题是,我如何处理这种情况,以便始终将我们重定向到默认的登录页面,或者最好是重定向到带有登录页面链接的generac Timeout页面?
答案 0 :(得分:0)
问题在于ForsmAuthentication模块,如果抛出401异常,它会自动重定向到SignIn表单。 Phil Haack blogged
关于如何为AJAX请求覆盖此行为。
因此,一旦安装了NuGet,您就可以直接订阅AJAX调用中的401错误:
$.ajax({
url: '/admin/secret/data',
type: 'POST',
contentType: 'application/json; charset=utf-8',
statusCode: {
200: function (data) {
alert('200: Authenticated');
// Bind the JSON data to the UI
},
401: function (data) {
alert('401: Unauthenticated');
// Handle the 401 error here.
}
}
});
通过订阅全局.ajaxError()
处理程序并检查来自服务器的返回代码,如果它是401,会话已经过期,您可以采取相应的行动。 或者普遍对所有AJAX请求执行此操作。
答案 1 :(得分:0)
我发现这篇文章对我的特定场景很有帮助。 我希望这有助于其他人