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

0voto

sumit Punkte 1705

Verwenden Sie die Option statusCode wie im folgenden Fall, Weiterleitungen sind in der Regel 301, 302 Statuscodes für Weiterleitungen.

$.ajax({
    type: <HTTP_METHOD>,
    url:  {server.url},
    data: {someData: true},
    statusCode: {
        301: function(responseObject, textStatus, errorThrown) {
            //yor code goes here
        },
        302: function(responseObject, textStatus, errorThrown) {
            //yor code goes here
        }           
    }
})
.done(function(data){
    alert(data);
})
.fail(function(jqXHR, textStatus){
    alert('Something went wrong: ' + textStatus);
})
.always(function(jqXHR, textStatus) {
   alert('Ajax request was finished')
});

0 Stimmen

Welche Version von jquery unterstützt die Option statusCode?

0 Stimmen

Es gibt sie seit Version 1.5, denke ich, api.jquery.com/jquery.ajax

0 Stimmen

Okay, Jedenfalls war ich auf der Suche nach Server-Side-Redirect, für die der Status-Code 200 sein wird

0voto

Mike Punkte 18362

Backend Frühling @ExceptionHandler .

  • 400 und Fehlerstring für geschäftsbezogene Ausnahmen (wird im Pop-up-Fenster angezeigt)
  • 302- und Location-Header auf Fehler-/Anmeldeseite für Anwendungsausnahmen bei Browseranfragen (zur automatischen Weiterleitung durch den Browser)
  • 500/400 und Location-Header auf Fehler-/Anmeldeseite für Ajax-Anfragen zur Umleitung durch Ajax-Callback

Über die Benutzersitzung an die Fehlerseite übergebene Ausnahmedetails

@Order(HIGHEST_PRECEDENCE)
public class ExceptionHandlerAdvise {

    private static Logger logger = LoggerFactory.getLogger(ExceptionHandlerAdvise.class);

    @Autowired
    private UserInfo userInfo;

    @ExceptionHandler(value = Exception.class)
    protected ResponseEntity<Object> handleException(Exception ex, WebRequest request) {
        HttpHeaders headers = new HttpHeaders();
        if (isBusinessException(ex)) {
            logger.warn(getRequestURL(request), ex);
            return new ResponseEntity<>(getUserFriendlyErrorMessage(ex), headers, BAD_REQUEST);
        } else {
            logger.error(getRequestURL(request), ex);
            userInfo.setLastError(ex);
            headers.add("Location", "/euc-portal/fault");
            return new ResponseEntity<>(null, headers, isAjaxRequest(request) ? INTERNAL_SERVER_ERROR : FOUND);
        }
    }
}

private boolean isAjaxRequest(WebRequest request) {
    return request.getHeader("x-requested-with") != null;
}

private String getRequestURL(WebRequest request) {
    if (request instanceof ServletWebRequest) {
        HttpServletRequest servletRequest = ((ServletWebRequest) request).getRequest();
        StringBuilder uri = new StringBuilder(servletRequest.getRequestURI());
        if (servletRequest.getQueryString() != null) {
            uri.append("?");
            uri.append(servletRequest.getQueryString());
        }
        return uri.toString();
    }
    return request.getContextPath();
}

LoginHandlerInterceptor

@Service
public class LoginHandlerInterceptor implements HandlerInterceptor {

    @Autowired
    private UserInfo userInfo;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (userInfo.getPrincipal() == null && !(request.getRequestURI().contains(LOGIN_URL) || request.getRequestURI().contains(FAULT_URL) || request.getRequestURI().startsWith("/app/css"))) {
            response.addHeader("Location", LOGIN_URL);
            response.setStatus(isAjaxRequest(request) ? BAD_REQUEST.value() : FOUND.value());
            return false;
        }
        return true;
    }
}

Kundencode

$.post('/app/request', params).done(function(response) {
    ...
}).fail(function(response) {
    if (response.getResponseHeader('Location')) {
        window.top.location.href = response.getResponseHeader('Location');
        return;
    }
    alert(response);
});

-1voto

Vladimir Prudnikov Punkte 6360

Außerdem möchten Sie den Benutzer wahrscheinlich auf die in den Kopfzeilen angegebene URL umleiten. Letztendlich wird es also so aussehen:

$.ajax({
    //.... other definition
    complete:function(xmlHttp){
        if(xmlHttp.status.toString()[0]=='3'){
        top.location.href = xmlHttp.getResponseHeader('Location');
    }
});

UPD: Opps. Habe die gleiche Aufgabe, aber es funktioniert nicht. Ich mache dieses Zeug. Ich werde Ihnen zeigen, Lösung, wenn ich es finden.

7 Stimmen

Diese Antwort sollte vom Autor gelöscht werden, da er selbst sagt, dass dies nicht funktioniert. Er kann später eine funktionierende Lösung posten. -1

0 Stimmen

Die Idee ist gut, aber das Problem ist, dass die Kopfzeile "Standort" nie übermittelt wird.

0 Stimmen

Meine Bearbeitung wurde abgelehnt, so... Sie müssen "var xmlHttp = $.ajax({ ...." die Variable kann nicht innerhalb sein... dann verwenden: console.log(xmlHttp.getAllResponseHeaders());

-3voto

camara90100 Punkte 734

Das hat bei mir funktioniert:

success: function(data, textStatus, xhr) {

        console.log(xhr.status);
}

Bei Erfolg erhält Ajax denselben Statuscode, den der Browser vom Server erhält, und führt ihn aus.

0 Stimmen

Das protokolliert nur den Status der Anfrage auf der Konsole? Die für Erfolg wird 2xx sein.

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