使用表单身份验证,使用非ajax请求,响应代码是302重定向,客户端浏览器重定向到account/logon
等默认登录页面。
然而,如果一个人正在发出Ajax请求并且登录会话超时,同样似乎ajax调用线程处理程序被赋予了302重定向,然后它请求account/logon
等页面并将其返回为responseXML
对象的jqXHR
属性。
显然,这样的行为会产生不必要的结果,因此返回的登录页面不是通常使用ajax调用请求的部分视图,并且包括布局标题,导航等布局元素,然后我的javascript将此HTML插入到目标元素中,从而导致完整布局效果中的完整布局。
我目前正在考虑通过简单地检查服务器,在/account/logon
动作方法上解决这个问题,如果请求是ajax请求,如果是这样,则返回部分视图,这将是一个登录表单。这似乎或多或少有效,但我似乎也无法设置响应代码,以帮助我区分在经过验证的请求时返回的正常内容数据和在会话超时时登录部分视图的数据。我可以用一些hacky的方式来做,但我只是想知道解决这个问题的正确/传统方法是什么。也许我应该使用jqXHR的textStatus属性来表示它是一个登录表单并且不使用状态代码来执行此操作,如何在ASP.NET中为jqHXR.textStatus设置值?
现在我正在尝试:
public ActionResult LogOn()
{
bool isAjaxCall = string.Equals("XMLHttpRequest", Request.Headers["x-requested-with"], StringComparison.OrdinalIgnoreCase);
if (isAjaxCall) { Response.StatusCode = 409; return PartialView("LogOnForAjaxView"); }
else return View();
}
$.post(path, function (data, textStatus, xhr) {
if(xhr.status != 409) $('#content-wrapper').html(data);
else // Present the form html, overlay it over the page content etc.
}
答案 0 :(得分:0)
在ajax调用的任何服务器方法中检查会话是否处于活动状态,如果不是则抛出异常。在ajax请求javascript的错误回调中处理此异常。