使用表单身份验证,对于非 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.
}