1532 Stimmen

Wie man eine Umleitungsanfrage nach einem jQuery Ajax-Aufruf verwaltet

Ich benutze $.post() um ein Servlet mit Ajax aufzurufen und dann das resultierende HTML-Fragment zu verwenden, um eine div Element auf der aktuellen Seite des Benutzers. Wenn die Sitzung jedoch beendet wird, sendet der Server eine Umleitungsanweisung, um den Benutzer zur Anmeldeseite zu schicken. In diesem Fall ersetzt jQuery das div Element mit dem Inhalt der Anmeldeseite und zwingt die Augen des Benutzers zu einem seltenen Anblick.

Wie kann ich eine Redirect-Direktive aus einem Ajax-Aufruf mit jQuery 1.2.6 verwalten?

1 Stimmen

(nicht eine Antwort als solche) - Ich habe dies in der Vergangenheit durch Bearbeiten der Jquery-Bibliothek und Hinzufügen einer Prüfung für die Login-Seite auf jedem XHR abgeschlossen getan. Nicht die beste Lösung, weil es jedes Mal getan werden müsste, wenn Sie aktualisieren, aber es löst das Problem.

1 Stimmen

Siehe dazugehörige Frage: stackoverflow.com/questions/5941933/

0 Stimmen

El HttpContext.Response.AddHeader und prüfen Sie den Erfolg von ajaxsetup

13voto

Priyanka Punkte 341
    <script>
    function showValues() {
        var str = $("form").serialize();
        $.post('loginUser.html', 
        str,
        function(responseText, responseStatus, responseXML){
            if(responseStatus=="success"){
                window.location= "adminIndex.html";
            }
        });     
    }
</script>

13voto

Chaim Klar Punkte 170

Lassen Sie mich noch einmal das von @Steg beschriebene Problem zitieren

Ich hatte ein ähnliches Problem wie Sie. Ich führe eine Ajax-Anfrage aus, die 2 mögliche Antworten hat: eine, die den Browser auf eine neue Seite umleitet und eine, die ein vorhandenes HTML-Formular auf der aktuellen Seite durch ein neues ersetzt ersetzt.

IMHO ist dies eine echte Herausforderung und muss offiziell auf die aktuellen HTTP-Standards ausgeweitet werden.

Ich glaube, der neue Http-Standard wird die Verwendung eines neuen Status-Codes vorsehen. Bedeutung: derzeit 301/302 weist den Browser an, den Inhalt von este Anfrage an eine neue location .

In der erweiterten Norm heißt es, dass, wenn die Antwort status: 308 (nur ein Beispiel), dann sollte der Browser die Hauptseite auf die location zur Verfügung gestellt.

Davon abgesehen bin ich geneigt, dies bereits zu imitieren Zukunft Verhalten, und daher, wenn eine document.redirect benötigt wird, habe ich den Server als Antwort:

status: 204 No Content
x-status: 308 Document Redirect
x-location: /login.html

Wenn JS die " status: 204 ", prüft es die Existenz der x-status: 308 Kopfzeile und führt eine document.redirect zu der Seite aus, die in der location Kopfzeile.

Ergibt das einen Sinn für Sie?

12voto

podeig Punkte 2463

Versuchen Sie

    $(document).ready(function () {
        if ($("#site").length > 0) {
            window.location = "<%= Url.Content("~") %>" + "Login/LogOn";
        }
    });

Setzen Sie es auf die Anmeldeseite. Wenn sie in einem Div auf der Hauptseite geladen wurde, wird sie auf die Login-Seite umgeleitet. "#site" ist die ID eines Divs, das sich auf allen Seiten außer der Login-Seite befindet.

12voto

John Punkte 350

Während die Antworten für Menschen zu arbeiten scheinen, wenn Sie Spring Security verwenden, habe ich gefunden, LoginUrlAuthenticationEntryPoint zu erweitern und spezifischen Code hinzufügen, um AJAX robuster zu behandeln. Die meisten der Beispiele fangen alle Weiterleitungen, nicht nur Authentifizierungsfehler. Dies war für das Projekt, an dem ich arbeite, unerwünscht. Möglicherweise müssen Sie auch ExceptionTranslationFilter erweitern und die Methode "sendStartAuthentication" überschreiben, um den Caching-Schritt zu entfernen, wenn Sie nicht möchten, dass die fehlgeschlagene AJAX-Anfrage im Cache gespeichert wird.

Beispiel AjaxAwareAuthenticationEntryPoint:

public class AjaxAwareAuthenticationEntryPoint extends
    LoginUrlAuthenticationEntryPoint {

    public AjaxAwareAuthenticationEntryPoint(String loginUrl) {
        super(loginUrl);
    }

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        if (isAjax(request)) {
            response.sendError(HttpStatus.UNAUTHORIZED.value(), "Please re-authenticate yourself");
        } else {
        super.commence(request, response, authException);
        }
    }

    public static boolean isAjax(HttpServletRequest request) {
        return request != null && "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
    }
}

Quellen: 1 , 2

3 Stimmen

Es wäre (für mich) hilfreich, wenn die Ablehner erklären würden, warum sie ihre Stimme abgeben. Wenn etwas an dieser Lösung schlecht ist, möchte ich aus meinen Fehlern lernen. Danke!

0 Stimmen

Wenn Sie Spring und auch JSF verwenden, dann prüfen Sie auch dies: ("partial/ajax").equalsIgnoreCase(request.getHeader("faces-request"));

0 Stimmen

Die Benutzer haben möglicherweise abgelehnt, weil Sie Folgendes nicht erwähnt haben: (1) die erforderlichen clientseitigen Modifikationen, um Ihre Fehlerantwort zu erkennen; (2) die erforderlichen Modifikationen der Spring-Konfiguration, um Ihren angepassten LoginUrlAuthenticationEntryPoint zur Filterkette hinzuzufügen.

11voto

Paul Richards Punkte 633

Ich habe das Problem gelöst, indem ich das Folgende in meine login.php-Seite eingefügt habe.

<script type="text/javascript">
    if (top.location.href.indexOf('login.php') == -1) {
        top.location.href = '/login.php';
    }
</script>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X