2013-01-07 220 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