我有一个由servlet驱动的Web应用程序,通过重定向到登录页面,在一段时间不活动后超时用户会话。我在Web客户端上有代码,检查了这一点,基本上类似于以下内容:
function error(request, errtype) {
if (request.status == 302) {
// Display a "timed out" dialog, then:
window.location = request.getResponseHeader("Location");
}
}
然而,最近这个计划停止了工作;在超时时,request.status为0.使用Firebug我可以看到返回了相同的HTTP 302响应。
我仔细阅读了XMLHttpRequest的规范,并找到了这一部分:
如果重定向不违反安全性(例如,它是相同的原点),支持无限循环注意事项,并且支持该方案,则在观察同源请求事件规则时透明地遵循重定向。
否则,这是网络错误。
我甚至不知道客户端应该自动遵循他们为响应Ajax请求而获得的重定向;我关心的浏览器之前没有这样做过,因为我上面的代码曾经工作过。我最近升级了我的Firefox版本,现在可能更符合规范。规范规定的网络错误将解释我看到的零响应代码。但是,我得到的重定向是同一个主机(虽然在不同的端口),应该没有无限循环,并且该方案仍然是HTTP,所以我不明白为什么我收到网络错误
有什么想法吗?
答案 0 :(得分:0)
你是如何实现这一功能的?如果你只是在200状态下将其发送到“错误”,显然这不起作用......
request.onreadystatechange = function( )
{
if( this.readyState == 4 )
{
// if we got a 200
if( this.status == 200 ){ /* cool */ }
// if we got anything else
else { error( this, this.status ); }
}
};
但我假设你知道这一点。此外,您可能应该在window.location
的末尾包含.href,并且可能是默认位置以防万一
// Display a "timed out" dialog, then:
window.location.href = request.getResponseHeader("Location") || defaultPage;
如果这不起作用,您可能希望在onreadystatechange
方法中尝试不同的状态,因为某些浏览器可能会将非200状态解释为错误。这些可能是(根据您正在阅读的相同规范):
0 (if it's considered aborted after unset, though unlikely)
2 (headers-sent) as that 302 code is actually a HTTP header
祝你好运!