我有发出AJAX调用的客户端。这些调用引用服务器端受Spring Security保护的URL。如果用户的会话超时,我在灯箱中有一个登录表单弹出窗口。用户成功登录后,我希望客户端重新执行AJAX调用。
以下是进行AJAX调用的客户端代码示例:
function handleSearchClick(evt) {
var setupOptions = {
success: loadSearch,
type: "POST",
dataType: "json",
url: "../search.ajax",
error: handleError, // how can I pass callback info i.e. I want to be able to execute $("#searchForm").ajaxSubmit(setupOptions); from handleError?
timeout: 50000
};
$("#searchForm").ajaxSubmit(setupOptions);
}
当身份验证失败时,服务器返回401,导致客户端调用handleError。是否可以将回调函数传递给handleError?我希望回调重新执行
$("#searchForm").ajaxSubmit(setupOptions);
我已经看到了这个问题的解决方案,其中服务器在会话超时的AJAX调用上返回成功响应。然后,success函数在响应中查找某些内容以了解会话超时。然后客户端在那里存储回调函数。我更喜欢在错误函数中处理这个问题。
答案 0 :(得分:3)
执行的请求
$("#searchForm").ajaxSubmit(setupOptions);
可以通过调用
在handleError函数中重新执行$.ajax(this);
无需传入回调函数来重新执行:
$("#searchForm").ajaxSubmit(setupOptions);
答案 1 :(得分:2)
我在这里提到过:How to send a form without refreshing the page?
这是为错误处理程序进行回调的方法。
$.ajax({
url: siteUrl + 'fetch/search',
type: "POST",
data: formData,
success: function(data) {
.....
},
error:function(x,e){
if(x.status==0){
alert('You are offline!!\n Please Check Your Network.');
}else if(x.status==404){
alert('Requested URL not found.');
}else if(x.status==500){
alert('Internel Server Error.');
}else if(e=='parsererror'){
alert('Error.\nParsing JSON Request failed.');
}else if(e=='timeout'){
alert('Request Time out.');
}else {
alert('Unknow Error.\n'+x.responseText);
}
}
});
但你可以做以下
function handleSearchClick(evt) {
var setupOptions = {
success: loadSearch,
type: "POST",
dataType: "json",
url: "../search.ajax",
error: handleError(x,e), // this should do it
timeout: 50000
};
$("#searchForm").ajaxSubmit(setupOptions);
}
答案 2 :(得分:2)
Closures救援:
function handleSearchClick(evt) {
var setupOptions = {
success: loadSearch,
type: "POST",
dataType: "json",
url: "../search.ajax",
timeout: 50000
};
setupOptions.error = handleError(setupOptions);
$("#searchForm").ajaxSubmit(setupOptions);
}
function handleError(setupOptions) {
return function () {
// handle error
// then re-submit
$("#searchForm").ajaxSubmit(setupOptions);
};
}
请注意,这会创建一个引用循环(setupOptions具有对handleError返回的错误函数的引用,错误函数引用了setupOptions),但这应该很容易被任何体面的浏览器垃圾收集。