【发布时间】:2010-11-21 04:29:22
【问题描述】:
我正在开发一个使用用户身份验证的项目。如果在发出请求时没有经过身份验证的会话,我的 AJAX 请求就会出现问题。
我的会话超时时间为 3 分钟,因此如果用户保持空闲 3 分钟然后执行一些导致 AJAX 请求的操作,则请求将失败并返回 403 错误。在这里,我打算做的是拦截来自页面的所有 AJAX 请求并向服务器发送 ping,该服务器将返回一个 JSON 对象,说明是否存在有效会话。如果有,则客户端将继续当前请求,否则它将重新加载当前页面,这会将用户带到登录页面,并且用户必须再次提供凭据。
这是我的实现。
$("#param-ajax").ajaxSend(function(evt, request, settings) {
var pingurl = GtsJQuery.getContextPath() + '/ping.json';
var escapedurl = pingurl.replace(/\//g, "\\/");
var regexpr1 = eval('/^' + escapedurl + '\\?.*$/');
var regexpr2 = eval('/^' + escapedurl + '$/');
// Proceed with the ping only if the url is not the ping url else it will
// cause recursive calls which will never end.
if (!regexpr1.test(settings.url) && !regexpr2.test(settings.url)) {
var timeout = false;
$.ajax({
url : pingurl,
cache : false,
data : {
url : settings.url
},
async : false,
complete : function(request, status) {
if (status == "error") {
try {
// GtsJQuery.getJsonObject() converts the string
// response to a JSON object
var result = GtsJQuery
.getJsonObject(request.responseText)
if (result.timeout) {
timeout = true;
return;
}
} catch (e) {
// ignore the error. This should never occure.
}
}
}
});
// Reload the window if there is a timeout -- means there is no valid
// sesstion
if (timeout) {
window.location.reload();
}
}
});
这里一切正常,包括 window.location.reload(),但原始 ajax 请求没有中止。由于触发页面重新加载后原始 AJAX 请求并未中止,因此 AJAX 请求也被发送到服务器。我想要一些机制,如果超时结果为真,我可以中止原始请求。
This post 提供了一些答案,但问题仍然存在于第三方插件,如使用 AJAX 的数据表。我们无法为这些 AJAX 请求编写错误处理程序。
谢谢。
【问题讨论】:
标签: javascript jquery