7

我有发出 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 调用上返回成功响应。然后,成功函数在响应中查找某些内容以了解会话超时。客户端然后在那里存储一个回调函数。我更喜欢在错误函数中处理这个问题。

4

3 回答 3

3

执行的请求

$("#searchForm").ajaxSubmit(setupOptions);

可以通过调用在handleError函数中重新执行

$.ajax(this);

无需传入回调函数重新执行:

$("#searchForm").ajaxSubmit(setupOptions);
于 2013-01-16T03:00:27.540 回答
2

关闭救援:

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 的引用),但这应该很容易被任何体面的浏览器进行垃圾收集。

于 2013-01-16T11:19:51.163 回答
2

我在这里提到过:如何在不刷新页面的情况下发送表单?

这是对错误处理程序进行回调的方式。

$.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);
}
于 2013-01-07T21:15:06.997 回答