2013-01-07 176 views
7

我有发出AJAX调用的客户端。这些调用引用受服务器端Spring Security保护的URL。如果用户的会话超时,我会在lightbox中弹出一个登录表单。用户成功登录后,我希望客户端重新执行AJAX调用。Spring Security登录成功后,如何回调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调用成功响应的解决方案。然后,成功函数查找响应中的某些内容以了解会话超时。客户端然后在那里存储一个回调函数。我更喜欢在错误函数中处理这个问题。

+0

我的答案是否适合您? – Alex

+0

感谢您的回答。然而,在下面的代码“但你可以做以下”,我不知道handleError将如何调用$(“#searchForm”)。ajaxSubmit(setupOptions)。你能不能编辑提供更多的细节如何做到这一点? – James

回答

3

请求

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

可以在的HandleError函数调用

$.ajax(this); 

有重新执行是不需要通过的回调函数来重新执行:

$("#searchForm").ajaxSubmit(setupOptions); 
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

错误需要是对函数的引用。但是,在上一段代码片段中,您可以调用一个函数。 – James

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

+0

谢谢!这是对这个问题的正确解决方案。我认为内置的jquery调用$ .ajax(this)将更好地以通用的方式处理来自多种类型请求的错误。直到发布我的问题之后,我才意识到这个功能是存在的。我给你的答案+1,因为它会很好的做到这一点,如果jquery调用不存在,将是我的选择。 – James