php - Welcher HTTP-Statuscode soll verwendet werden, um dem Client mitzuteilen, dass die Sitzung abgelaufen ist?




ajax yui http-status-codes (9)

In einer Webseite verwendet es den YUI-Verbindungsmanager / die Datenquelle, um AJAX-Anfragen an den Server zu senden, wenn die Sitzung (die die Information enthält, ob der Benutzer authentifiziert wurde) bereits abgelaufen ist, welche Ajax-Antworten nur authentifiziert werden können Benutzer sollten einen HTTP-Statuscode zurücksenden, der dem Client mitteilt, dass die Sitzung bereits abgelaufen ist, dann leitet der Client ihn entweder auf die Anmeldeseite um oder fragt ihn, ob er die Sitzung verlängern möchte.

Meine Frage ist, dass in dieser Situation welcher HTTP-Statuscode am besten geeignet ist, um dem Client mitzuteilen, dass die Sitzung abgelaufen ist?

Liste der HTTP-Statuscodes aus Wiki


Answers

Laut dem Wikipedia Link von Http Status Codes von Bobo:

440 Login Timeout (Microsoft)

    A Microsoft extension. Indicates that your session has expired.

Am besten kann ich einen HTTP 401-Statuscode mit einem WWW-Authenticate-Header vorschlagen.

Das Problem mit 403 Anfragen ist die RFC 2616 Staaten "Autorisierung wird nicht helfen und die Anfrage sollte nicht wiederholt werden." (Es spielt keine Rolle, ob Sie authentifiziert sind oder nicht, Sie werden niemals Zugang zu dieser Ressource erhalten).

Das Problem mit 401- Anfragen ist, dass sie "ein WWW-Authenticate-Header-Feld enthalten müssen". Wie jemand bemerkt hat, scheint es keinen Verstoß gegen die Spezifikation zu sein, einen benutzerdefinierten Wert in einem WWW-Authenticate-Header zu verwenden.

Ich kann keinen Grund in RFC 2617 sehen, warum ein HTTP 401-Status in Kombination mit einem benutzerdefinierten WWW-Authenticate-Header wie diesem nicht in Ordnung wäre:

WWW-Authenticate: MyAuthScheme realm="http://example.com"

Die oAuth-Spezifikation scheint genau dies zu tun, da sie dies empfiehlt (obwohl sie eine merkwürdige Interpretation des RFC haben):

WWW-Authenticate: OAuth realm="http://server.example.com/"

Dies scheint nicht spezifisch durch den RFC SANCTIONED zu sein, aber ich kann nicht wirklich sehen, dass es von ihr verboten ist (es scheint nicht mit irgendeinem MUSS in Konflikt zu stehen oder MUSS NICHT, SOLLTE oder SOLLTE NICHT BEDINGEN).

Ich wünschte, es gäbe einen spezifischeren HTTP-Statuscode für Timeouts und Dinge wie CSRF-Tokens wären ungültig, also war das klarer.


Code 408. "Request Timeout", scheint perfekt - RFC 2616 erklärt es bedeutet

Der Client hat innerhalb der Zeit, zu der der Server bereit war zu warten, keine Anforderung generiert.

dh genau eine "Auszeit", genau wie Sie es wünschen!


Ich glaube, der entsprechende Code wird 403 / Verboten sein. Es gibt keine, die direkt mit Sitzungen zusammenhängen.


Für Nicht-Ajax-Anfragen verwende ich eine 302-Weiterleitung.

Für Ajax-Anfragen verwende ich 200 für bekannte Fehler. Auf diese Weise kann ich das Datenobjekt nutzen. Ich finde das Datenobjekt einfacher zu bearbeiten als jqXHR für Informationen zu analysieren. Und dann brauche ich mir keine Gedanken darüber zu machen, welchen HTTP-Statuscode ich für meine Situation verwenden soll.

jQuery Beispiel:

$.ajax({
    //send data to server
})
.done(function(data, textStatus, jqXHR) {
    if (data.success) {
        //then process return data
    }
    else {
        //get error type or message from data object
        //could use custom error codes
    }
})
.fail(function(jqXHR, textStatus, errorThrown) {
    //handle unknown errors
});

Was ist mit 419 - es ist kein Standard, aber die Beschreibung auf Wikipedia scheint zu passen:

419 Authentifizierungszeitlimit

Kein Teil des HTTP-Standards, 419 Authentication Timeout bedeutet, dass die zuvor gültige Authentifizierung abgelaufen ist. Es wird als Alternative zu 401 Nicht autorisiert verwendet, um von ansonsten authentifizierten Clients zu unterscheiden, denen der Zugriff auf bestimmte Serverressourcen verweigert wird.


Ich würde ein HTTP 401 empfehlen.

Während ein 403 im Grunde sagt: "Du darfst nicht gehen, geh nicht zurück und komm nicht zurück", sagt ein 401: "Wir wissen nicht, ob es dir erlaubt ist oder nicht, weil du deine ID nicht mitgebracht hast hol es dir und versuche es noch einmal. "

Vergleichen Sie die Wikipedia Definitionen :

HTTP 403 - Die Anfrage war eine legale Anfrage, der Server verweigert jedoch die Antwort.

HTTP 401 - Ähnlich wie 403 verboten, aber speziell für den Fall, dass eine Authentifizierung möglich ist, aber fehlgeschlagen ist oder noch nicht bereitgestellt wurde.


In Wahrheit gibt es keinen Standard-HTTP-Statuscode für ein Sitzungszeitlimit. Sitzungen werden in der Anwendungsschicht und nicht in der HTTP-Transportschicht implementiert.

Es gibt einen benutzerdefinierten Statuscode, den Microsoft für das Sitzungszeitlimit verwendet hat: 599, oder Sie können einfach Ihren eigenen Statuscode im Bereich 5xx erstellen.

Aus dem Wiki mit den Statuscodes:

599 Timeout-Fehler bei Netzwerkverbindung (Unbekannt) Dieser Statuscode ist in RFCs nicht angegeben, wird jedoch von HTTP-Proxys der Microsoft Corp. verwendet, um ein Netzwerkverbindungstimeout hinter dem Proxy an einen Client vor dem Proxy zu signalisieren.

Ich verwende den benutzerdefinierten Statuscode 599 für ein Sitzungszeitlimit und überprüfe dann in der AJAX-Antwort nach diesem.


Ich empfehle mysqllnd anstelle von mysql weil Sie viele Probleme haben würden, wie zum Beispiel das Konvertieren von Zahlen und der Bit-Typ, der das Problem mit der mysql Erweiterung auswertet.

Auf ubuntu installiere mysqllnd mit folgendem Befehl:

sudo apt-get install php5-mysqlnd






php ajax yui http-status-codes