2013-01-07 31 views
7

Ich habe Kunden, die AJAX-Anrufe ausgeben. Diese Aufrufe verweisen auf URLs, die auf der Serverseite durch Spring Security geschützt sind. Wenn die Sitzung des Benutzers abgelaufen ist, habe ich ein Anmeldeformular in einem Leuchtkasten. Nachdem der Benutzer sich erfolgreich angemeldet hat, möchte ich, dass der Client den AJAX-Aufruf erneut ausführt.Wie kann ich nach erfolgreicher Spring Security-Anmeldung die AJAX-Erfolgsfunktion aufrufen?

Hier ist ein Beispiel für die Client-Seite Code, der einen AJAX-Aufruf macht:

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); 
} 

Wenn die Authentifizierung fehlschlägt, der Server eine 401 zurückgibt, die in dem Client führt Aufruf handle. Ist es möglich, eine Callback-Funktion an handleError zu übergeben? Ich würde der Rückruf

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

I Lösungen für dieses Problem gesehen haben erneut ausführen wollen, wo der Server eine Erfolgsantwort auf AJAX Anrufe zurückgibt, die eine Sitzung haben abgelaufen. Dann sucht die Erfolgsfunktion nach etwas in der Antwort, um das Sitzungszeitlimit zu kennen. Der Client speichert dort eine Callback-Funktion. Ich bevorzuge es jedoch, dies in der Fehlerfunktion zu behandeln.

+0

hat meine Antwort für Sie funktioniert? – Alex

+0

Danke für die Antwort. Im Code unten "Aber Sie könnten Folgendes tun", bin ich mir nicht sicher, wie handleError $ ("# searchForm") aufrufen kann. AjaxSubmit (setupOptions). Könnten Sie bitte bearbeiten, um mehr Details darüber zu erhalten, wie dies geschehen würde? – James

Antwort

3

Die Anforderung von

ausgeführt tun
$("#searchForm").ajaxSubmit(setupOptions); 

kann

$.ajax(this); 

Es durch den Aufruf in der handle Funktion erneut ausgeführt werden ist nicht nötig, um ein zu übergeben Callback-Funktion erneut auszuführen:

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

Ich habe es hier erwähnt: How to send a form without refreshing the page?

Es ist die Möglichkeit, einen Rückruf für die Fehlerbehandlung zu haben.

$.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); 
     } 
    } 
}); 

Aber man könnte die folgende

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

Fehler muss eine Referenz zu einer Funktion sein. Im letzten Code-Snippet haben Sie jedoch einen Aufruf einer Funktion. – James

2

Closures zur Rettung:

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); 
    }; 
} 

Hinweis, dass diese eine Referenzschleife erzeugt (setupOptions ist ein Hinweis auf die Fehlerfunktion durch handle zurückgegeben, die Fehlerfunktion hat ein Verweis auf setupOptions), aber dies sollte leicht Müll-Sammlung von jedem anständigen Browser sein.

+0

Danke! Dies ist eine korrekte Lösung für die Frage. Ich denke, dass der eingebaute jquery-Aufruf $ .ajax (this) besser dafür ist, Fehler von mehreren Anfragetypen auf generische Weise zu behandeln. Ich wusste nicht, dass Funktionalität existiert, bis ich meine Frage gestellt habe. Ich gab Ihrer Antwort +1, da dies eine großartige Möglichkeit wäre, dies zu tun, und wäre meine Wahl, wenn der jQuery-Aufruf nicht existieren würde. – James

Verwandte Themen