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

8voto

Tomer Punkte 1454

Die folgenden Informationen könnten für einige nützlich sein:

Ich wollte, dass die Kunden bei jeder Rest-Aktion, die ohne Autorisierungs-Token gesendet wird, auf die Anmeldeseite umgeleitet werden. Da alle meine Rest-Aktionen Ajax-basiert sind, brauchte ich einen guten generischen Weg, um auf die Login-Seite umzuleiten, anstatt die Ajax-Erfolgsfunktion zu behandeln.

Ich habe Folgendes getan:

Bei jeder Ajax-Anfrage gibt mein Server eine Json 200-Antwort "NEED TO AUTHENTICATE" zurück (wenn der Client sich authentifizieren muss).

Einfaches Beispiel in Java (serverseitig):

@Secured
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {

    private final Logger m_logger = LoggerFactory.getLogger(AuthenticationFilter.class);

    public static final String COOKIE_NAME = "token_cookie"; 

    @Override
    public void filter(ContainerRequestContext context) throws IOException {        
        // Check if it has a cookie.
        try {
            Map<String, Cookie> cookies = context.getCookies();

            if (!cookies.containsKey(COOKIE_NAME)) {
                m_logger.debug("No cookie set - redirect to login page");
                throw new AuthenticationException();
            }
        }
        catch (AuthenticationException e) {
            context.abortWith(Response.ok("\"NEED TO AUTHENTICATE\"").type("json/application").build());
        }
    }
}

In meinem Javascript habe ich den folgenden Code eingefügt:

$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
    var originalSuccess = options.success;

    options.success = function(data) {
        if (data == "NEED TO AUTHENTICATE") {
            window.location.replace("/login.html");
        }
        else {
            originalSuccess(data);
        }
    };      
});

Und das war's dann auch schon.

5voto

karthik339 Punkte 189

Wenn Sie auch die Werte übergeben wollen, können Sie auch die Sitzungsvariablen setzen und auf Beispiel: In Ihrem jsp können Sie schreiben

<% HttpSession ses = request.getSession(true);
   String temp=request.getAttribute("what_you_defined"); %>

Und dann können Sie diesen temporären Wert in Ihrer Javascript-Variablen speichern und damit herumspielen

5voto

jocull Punkte 18543

Ich hatte keinen Erfolg mit der Kopfzeile Lösung - sie wurden nie in meinem ajaxSuccess / ajaxComplete Methode abgeholt. Ich habe Stegs Antwort mit der benutzerdefinierten Antwort verwendet, aber ich habe die JS-Seite etwas geändert. Ich habe eine Methode eingerichtet, die ich in jeder Funktion aufrufe, damit ich Standard $.get y $.post Methoden.

function handleAjaxResponse(data, callback) {
    //Try to convert and parse object
    try {
        if (jQuery.type(data) === "string") {
            data = jQuery.parseJSON(data);
        }
        if (data.error) {
            if (data.error == 'login') {
                window.location.reload();
                return;
            }
            else if (data.error.length > 0) {
                alert(data.error);
                return;
            }
        }
    }
    catch(ex) { }

    if (callback) {
        callback(data);
    }
}

Beispiel für den Einsatz...

function submitAjaxForm(form, url, action) {
    //Lock form
    form.find('.ajax-submit').hide();
    form.find('.loader').show();

    $.post(url, form.serialize(), function (d) {
        //Unlock form
        form.find('.ajax-submit').show();
        form.find('.loader').hide();

        handleAjaxResponse(d, function (data) {
            // ... more code for if auth passes ...
        });
    });
    return false;
}

5voto

Bretticus Punkte 886

Ich wollte nur auf alle Ajax-Anforderungen für die gesamte Seite zu klinken. @SuperG hat mir den Anfang gemacht. Hier ist, was ich am Ende hatte:

// redirect ajax requests that are redirected, not found (404), or forbidden (403.)
$('body').bind('ajaxComplete', function(event,request,settings){
        switch(request.status) {
            case 301: case 404: case 403:                    
                window.location.replace("http://mysite.tld/login");
                break;
        }
});

Ich wollte speziell auf bestimmte http-Statuscodes prüfen, um meine Entscheidung zu treffen. Allerdings können Sie nur binden, um ajaxError etwas anderes als Erfolg zu erhalten (200 nur vielleicht?) Ich könnte gerade geschrieben haben:

$('body').bind('ajaxError', function(event,request,settings){
    window.location.replace("http://mysite.tld/login");
}

1 Stimmen

Letzteres würde alle anderen Fehler verdecken, was die Fehlersuche erschwert.

1 Stimmen

Ein 403 bedeutet nicht, dass der Benutzer nicht authentifiziert ist, sondern dass der (wahrscheinlich authentifizierte) Benutzer keine Berechtigung hat, die angeforderte Ressource anzuzeigen. Es sollte also nicht auf die Anmeldeseite umgeleitet werden

5voto

Im Servlet sollten Sie response.setStatus(response.SC_MOVED_PERMANENTLY); um den xmlHttp-Status "301" zu senden, den Sie für eine Weiterleitung benötigen...

und in der $.ajax-Funktion sollten Sie nicht die .toString() Funktion..., einfach

if (xmlHttp.status == 301) { top.location.href = 'xxxx.jsp'; }

das Problem ist, dass es nicht sehr flexibel ist, man kann nicht entscheiden, wohin man umleiten will.

Umleitung durch die Servlets sollte der beste Weg sein. aber ich kann immer noch nicht den richtigen Weg, es zu tun finden.

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