Angenommen, ich hatte eine Anwendung, die die folgenden HTTP-Header gesendet hat, um das Cookie "a" zu setzen:
Set-Cookie: a=1;Path=/;Version=1
Set-Cookie: a=2;Path=/example;Version=1
Wenn ich /example
auf dem Server zugreife, sind beide Pfade gültig, daher habe ich zwei Cookies mit dem Namen "a"! Da der Browser keine Pfadinformationen sendet, können die beiden Cookies nicht unterschieden werden.
Cookie: a=2; a=1
Wie soll dieser Fall behandelt werden? Den ersten auswählen? Eine Liste mit allen Cookie-Werten erstellen? Oder sollte ein solcher Fall als Fehler eines Entwicklers angesehen werden?
Antworten:
Aus diesem Artikel auf SitePoint :
Bearbeiten: Diese Informationen aus dem Jahr 2010 scheinen veraltet zu sein. Es scheint, dass Browser jetzt mehrere Cookies zurücksenden können. Weitere Informationen finden Sie in der Antwort von @Nate unten
quelle
.a.com
und Hosta.com
Die Antwort auf einen Artikel in SitePoint ist nicht vollständig. Bitte beachten Sie RFC 6265 (um fair zu sein, dieser RFC wurde 2011 veröffentlicht, nachdem diese Frage gestellt wurde, die den vorherigen RFC 2965 aus dem Jahr 2000 und den RFC 2109 aus dem Jahr 1997 ersetzt).
In Abschnitt 5.4 , Unterabschnitt 2 heißt es:
Es gibt auch dieses kleine Juwel in Abschnitt 4.2.2 :
Beachten Sie in Ihrem Beispiel-Anforderungscookie ( Cookie: a = 2; a = 1 ), dass das mit dem Pfad / Beispiel ( a = 2 ) gesetzte Cookie einen längeren Pfad hat als das mit dem Pfad / ( a = 1 ) wird zuerst in der Zeile an Sie zurückgeschickt, was der Empfehlung der Spezifikation entspricht. Sie gehen also mehr oder weniger richtig davon aus, dass Sie den ersten Wert auswählen könnten .
Leider ist die in RFCs verwendete Sprache äußerst spezifisch - die Verwendung der Wörter SOLLTE und SOLLTE NICHT zu Mehrdeutigkeiten in RFCs führen. Diese zeigen an Konventionen, sollte beachtet werden, sind aber nicht erforderlich , um die Spezifikation sein konformen. Obwohl ich den RFC dafür recht gut verstehe, habe ich nicht nachgeforscht, was Kunden in der realen Welt tun. Es ist möglich, dass ein oder mehrere Browser oder andere Software, die als HTTP-Clients fungieren, das Cookie mit dem längsten Pfad (z. B. / Beispiel ) nicht zuerst im Cookie: -Header senden .
Wenn Sie in der Lage sind, den Wert des Cookies zu kontrollieren und Ihre Lösung kinderleicht machen möchten, sind Sie entweder am besten dran:
Verwenden eines anderen Cookie-Namens zum Überschreiben bestimmter Pfade, z.
Speichern Sie den gewünschten Pfad im Cookie-Wert selbst:
Für beide Problemumgehungen ist zusätzliche Logik auf dem Server erforderlich, um den gewünschten Cookie-Wert auszuwählen, indem die angeforderte URL mit der Liste der verfügbaren Cookies verglichen wird. Es ist nicht zu hübsch. Es ist bedauerlich , der RFC nicht die Weitsicht hat zu verlangen , dass ein längerer Weg vollständig ein Cookie mit einem kürzeren Pfad überschreibt (zB: in Ihrem Beispiel, würden Sie erhalten Cookie: a = 2 nur ).
quelle
path=/;Path=/
Spezifikation FRC-6265? Ich habe eine solche Erwähnung nicht gefunden. Tomcat bedroht jedes ";" im Pfad als falsches Symbola=2&path=/example;Path=/example
so, dass es keinen;
Pfad gibt.Es ist nichts Falsches daran, mehrere Werte für denselben Namen zu haben ... wenn Sie sie möchten. Sie können sogar zusätzlichen Kontext in den Wert einbetten.
Wenn Sie dies nicht tun, sind natürlich unterschiedliche Namen eine Lösung, wenn Sie beide Kontexte möchten.
Die Alternative besteht darin, denselben Cookie-Namen mit demselben Pfad (und derselben Domäne) auch über die spezifischeren Pfade zu senden. Diese festgelegten Cookie-Anweisungen überschreiben den Wert dieses Cookies.
Nachdem Sie nun den wichtigsten Teil (wie sie funktionieren) kennen und das, was Sie benötigen, auf verschiedene Arten erreichen können, lautet meine Antwort auf Ihre Frage: Dies ist ein Entwicklerproblem.
quelle
Mir sind sicherlich Anwendungen bekannt, die dies ausgiebig mit mehreren Sitzungs-IDs tun - und anscheinend konsistent funktionieren. Ich weiß jedoch nicht - und habe auch nicht die Absicht herauszufinden -, ob dies der Fall ist, da der Browser die Cookies in einer einheitlichen Reihenfolge zurückgibt, je nachdem, wann sie festgelegt wurden / für welchen Pfad sie festgelegt wurden oder ob die App versucht, mit den einzelnen Cookies übereinzustimmen eine zu einer bestehenden Sitzung.
Ich würde dringend empfehlen, diese Praxis zu vermeiden.
Wenn Sie jedoch wirklich wissen möchten, wie die Browser (und Apps) mit diesem Szenario umgehen, bauen Sie einen Prüfstand und probieren Sie ihn aus.
quelle
Wenn Sie das Java / Scala-Framework verwenden Spielen: Achtung! Wenn eine Anfrage mehrere Cookies mit demselben Namen enthält, zeigt Play Ihrem Code nur 1 davon an.
quelle
Wenn Sie sie unterscheiden müssen, müssen Sie ihnen unterschiedliche Schlüsselwerte geben.
quelle