it-swarm.com.de

Überprüfen Sie, ob ein Cookie vorhanden ist

Von einer schnellen Suche an Stapelüberlauf sah ich Leute, die die folgende Art der Überprüfung vorschlugen, ob ein Cookie existiert:

HttpContext.Current.Response.Cookies["cookie_name"] != null

oder (innerhalb einer Page Klasse):

this.Response.Cookies["cookie_name"] != null

Wenn ich jedoch versuche, den Indexer (oder die Methode Cookies.Get) zum Abrufen eines nicht vorhandenen Cookies zu verwenden, scheint es tatsächlich create ein 'Standard'-Cookie mit diesem Namen zu sein und diesen zurückzugeben Egal welchen Cookie-Namen ich benutze, er gibt niemals null zurück. (und noch schlimmer - erzeugt einen unerwünschten Cookie)

Mache ich hier etwas falsch oder gibt es eine andere Möglichkeit, einfach nach dem Namen eines bestimmten Cookies zu suchen?

44
Acidic

Response.Cookies Enthält die Cookies, die an den Browser zurückgesendet werden. Wenn Sie wissen möchten, ob ein Cookie existiert, sollten Sie sich wahrscheinlich Request.Cookies Ansehen.

Um festzustellen, ob ein Cookie existiert, können Sie Cookies.Get(string) aktivieren. Wenn Sie diese Methode jedoch für das Response-Objekt verwenden und das Cookie nicht vorhanden ist, wird dieses Cookie erstellt.

Siehe MSDN-Referenz für HttpCookieCollection.Get - Methode (Zeichenfolge)

30
zmbq

Manchmal müssen Sie noch wissen, ob in Response ein Cookie vorhanden ist. Dann können Sie überprüfen, ob ein Cookie-Schlüssel existiert:

HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")

Weitere Informationen finden Sie hier .

In meinem Fall musste ich das Antwort-Cookie in der Application_EndRequest-Methode in Global.asax ändern. Wenn es kein Cookie gibt, berühre ich es nicht:

string name = "myCookie";
HttpContext context = ((HttpApplication)sender).Context;
HttpCookie cookie = null;

if (context.Response.Cookies.AllKeys.Contains(name))
{
    cookie = context.Response.Cookies[name];
}

if (cookie != null)
{
    // update response cookie
}
50
marisks

Hier gibt es viele richtige Antworten, je nachdem, was Sie erreichen möchten. Hier ist mein Versuch, eine umfassende Antwort zu geben:

Sowohl das Objekt Request als auch das Objekt Response enthalten die Eigenschaften Cookies, bei denen es sich um Objekte des Typs HttpCookieCollection handelt.

Request.Cookies:

  • Diese Sammlung enthält vom Kunden erhaltene Cookies
  • Diese Sammlung ist schreibgeschützt
  • Wenn Sie versuchen, auf ein nicht vorhandenes Cookie aus dieser Sammlung zuzugreifen, erhalten Sie einen null -Wert.

Response.Cookies:

  • Diese Sammlung enthält nur Cookies, die vom Server während der aktuellen Anforderung hinzugefügt wurden.
  • Diese Sammlung ist beschreibbar
  • Wenn Sie versuchen, auf ein nicht vorhandenes Cookie aus dieser Sammlung zuzugreifen, erhalten Sie ein neues Cookie-Objekt. Wenn das Cookie, auf das Sie zugreifen wollten , NICHT in der Request.Cookies - Auflistung vorhanden ist , wird es hinzugefügt (wenn jedoch das Request.Cookies Enthält bereits ein Cookie mit demselben Schlüssel. Auch wenn sein Wert veraltet ist, wird es nicht aktualisiert, um die Änderungen des neu erstellten Cookies in der Auflistung Response.Cookies Widerzuspiegeln.

Lösungen


Führen Sie einen der folgenden Schritte aus, um zu überprüfen, ob auf dem Client ein Cookie vorhanden ist

  • Request.Cookies["COOKIE_KEY"] != null
  • Request.Cookies.Get("COOKIE_KEY") != null
  • Request.Cookies.AllKeys.Contains("COOKIE_KEY")

Wenn Sie überprüfen möchten, ob ein Cookie vorhanden ist, das vom Server hinzugefügt wurde während der aktuellen Anforderung, gehen Sie wie folgt vor:

  • Response.Cookies.AllKeys.Contains("COOKIE_KEY") (siehe hier )

Es wird versucht, nach einem Cookie zu suchen, das vom Server hinzugefügt wurde während der aktuellen Anforderung mit einer dieser Methoden ...

  • Response.Cookies["COOKIE_KEY"] != null
  • Response.Cookies.Get("COOKIE_KEY") != null (siehe hier )

... erstellt ein Cookie in der Sammlung Response.Cookies und der Status wird zu true ausgewertet.

37
Trevor

Sie müssen HttpContext.Current.Request.Cookies, nicht Response.Cookies.

Randnotiz: Cookies werden auf Anfrage kopiert am Response.Cookies.Add, wodurch überprüft wird, ob sich einer von beiden für neu hinzugefügte Cookies gleich verhält. Eingehende Cookies werden jedoch niemals in Response widergespiegelt.

Dieses Verhalten ist in der Eigenschaft HttpResponse.Cookies dokumentiert:

Nachdem Sie mithilfe der Auflistung HttpResponse.Cookies ein Cookie hinzugefügt haben, ist das Cookie sofort in der Auflistung HttpRequest.Cookies verfügbar, auch wenn die Antwort nicht an den Client gesendet wurde.

35
Alexei Levenkov
public static class CookieHelper
{
    /// <summary>
    /// Checks whether a cookie exists.
    /// </summary>
    /// <param name="cookieCollection">A CookieCollection, such as Response.Cookies.</param>
    /// <param name="name">The cookie name to delete.</param>
    /// <returns>A bool indicating whether a cookie exists.</returns>
    public static bool Exists(this HttpCookieCollection cookieCollection, string name)
    {
        if (cookieCollection == null)
        {
            throw new ArgumentNullException("cookieCollection");
        }

        return cookieCollection[name] != null;
    }
}

Verwendung:

Request.Cookies.Exists("MyCookie")
4
Levitikon

Entschuldigung, nicht genug Mitarbeiter, um einen Kommentar hinzuzufügen, aber aus der Antwort von zmbq:

Um festzustellen, ob ein Cookie vorhanden ist, können Sie Cookies aktivieren. Get (string) ändert die Cookie-Sammlung nicht.

ist vielleicht nicht ganz korrekt, da Cookies.Get (string) tatsächlich ein Cookie mit diesem Namen erzeugt, falls es noch nicht existiert. Allerdings, wie er sagte, müssen Sie Request.Cookies betrachten, nicht Response.Cookies Also, so etwas wie:

bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;
2
Fiddles

Sie können so etwas tun, um den Wert der Cookies herauszufinden:

Request.Cookies[SESSION_COOKIE_NAME].Value
0
Hernan Bogantes