我们正在开发MVC3应用程序,以便通过ajax调用调用我们的大多数操作方法并返回partialview。我们遇到一种情况,我们需要确定是否从表单身份验证超时调用操作方法。
public ActionResult LogOn()
{
// I want to return View("LogOn"); if the call is coming from
// Form Authentication time out
return PartialView(Model);
}
这是我的web.config看起来像:
<authentication mode="Forms">
<forms loginUrl="~/Home/LogOn" timeout="20" />
</authentication>
感谢您的意见。
答案 0 :(得分:1)
如果身份验证Cookie已超时,您的操作将永远不会被触发。表单身份验证模块直接重定向到登录页面。您从客户端脚本中检测这种情况的一种可能性是在服务此登录页面的控制器操作中设置自定义HTTP标头:
public ActionResult LogOn()
{
var model = ...
Response.AppendHeader("X-LOGON", "true");
return View(model);
}
然后在执行AJAX请求时,您可以在XHR对象上使用getResponseHeader
方法,以验证是否设置了X-LOGON
标头,这意味着服务器重定向到登录页面。在这种情况下,在您成功的AJAX处理程序中,而不是简单地将服务器响应注入DOM或依赖于返回的JSON,您可以显示一些警报消息,通知用户他的身份验证会话已超时并且他需要再次登录。另一种可能性是使用window.location.href
方法自动将他重定向到登录页面:
$.ajax({
url: '/home/some_protected_action',
success: function (data, textStatus, XMLHttpRequest) {
if (XMLHttpRequest.getResponseHeader('X-LOGON') === 'true') {
// the LogOn page was displayed as a result of this request
// probably timeout => act accordingly
}
}
});
答案 1 :(得分:0)
服务器无法区分正常加载页面的用户与执行页面刷新的用户。
有很多方法可以区分常规请求和AJAX请求,但听起来并不像你要求的那样。
答案 2 :(得分:0)
没有简单的方法,但是如果你应用Post-Redirect-Get,我不确定你会遇到这个问题。