我正在使用jQuery和jQuery.form插件来提交我的表单(也使用ASP.Net MVC)。
问题是用户位于使用表单身份验证的网站部分,如果他们的身份验证cookie在页面上的时间到期而不是返回状态302,这将是重定向到登录页面,我仍然得到200?
在FireBug中,我看到302 Found,然后我的登录页面将作为200发送,这是发送回我的Ajax调用的状态代码。如果我从未看到302发送回jQuery表单插件,如何检测到它们已被注销?
答案 0 :(得分:9)
我真的很喜欢这个解决方案。通过将ajax请求的302响应更改为401,它允许您在客户端设置ajax以监视查找401的任何ajax请求,以及是否找到重定向到登录页面的请求。非常简单有效。
的Global.asax:
protected void Application_EndRequest()
{
if (Context.Response.StatusCode == 302 &&
Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
Context.Response.Clear();
Context.Response.StatusCode = 401;
}
}
客户端代码:
$(function () {
$.ajaxSetup({
statusCode: {
401: function () {
location.href = '/Logon.aspx?ReturnUrl=' + location.pathname;
}
}
});
});
答案 1 :(得分:1)
尝试使用缓存:false cache option in jquery ajax:
$.ajax({
url: "test.html",
cache: false,
success: function(html){
$("#results").append(html);
}
});
--- EDIT 在C#代码中尝试使用它:
protected void Page_Load(object sender, System.EventArgs e)
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
...
}
答案 2 :(得分:0)
之前遇到过类似的问题。 solution given in this question有用吗?
答案 3 :(得分:0)
这是我过去使用的解决方案:
服务器端:
当我检查会话是否仍然有效时,我也会留意“X-Requested-With”标头,如果您使用的是jQuery,则应该是“XMLHttpRequest”(注意:IE倾向于以小写形式返回标题名称,因此也要注意这一点。如果会话确实已经过期并且标头存在,而不是使用HTTP重定向,我会使用这样的简单JSON对象进行响应:
{ "SESSION": "EXPIRED" }
客户方:
在我的onload代码中,我使用jQuery的ajaxComplete事件来检查会话过期对象的所有传入请求有效负载。代码看起来像这样:
$(window).ajaxComplete(function(ev, xmlhr, options){
try {
var json = $.parseJSON(xmlhr.responseText);
}
catch(e) {
console.log('Session OK');
return;
}
if ($.isPlainObject(json) && json.SESSION == 'EXPIRED') {
console.log('Session Expired');
//inform the user and window.location them somewhere else
return;
}
console.log('Session OK');
});
答案 4 :(得分:0)
我很确定你永远不会在XHR对象的完成状态下得到302。如果发生重定向,则连接仍在进行中,直到您看到登录页面的响应(如果存在,则应为200)。
但是,为什么你需要看302?当然,如果您正在重定向到login.php,那么只需获取返回响应的url(或解析内容)就会告诉您它们已经注销了吗?
另一种方法是,只有在会话过期时(在执行某些操作之前)才知道,是使用setTimeout或类似方法轮询服务器以获取有关身份验证状态的信息。
祝你好运。