web-dev-qa-db-fra.com

Vérifier si le cookie existe

À partir d'une recherche rapide sur Stack Overflow , j'ai vu des personnes suggérer la méthode suivante pour vérifier si un cookie existe:

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

ou (dans une classe Page):

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

Cependant, lorsque j'essaie d'utiliser l'indexeur (ou la méthode Cookies.Get) pour récupérer un cookie qui n'existe pas, il semble en fait créer un cookie 'par défaut' avec ce nom et le renvoyer, donc peu importe le nom du cookie que j'utilise, il ne renvoie jamais la valeur null. (et même pire - crée un cookie indésirable)

Est-ce que je fais quelque chose de mal ici, ou existe-t-il un moyen différent de simplement vérifier l'existence d'un cookie spécifique par son nom?

44
Acidic

Response.Cookies Contient les cookies qui seront renvoyés au navigateur. Si vous voulez savoir si un cookie existe, vous devriez probablement regarder dans Request.Cookies.

Quoi qu'il en soit, pour voir si un cookie existe, vous pouvez vérifier Cookies.Get(string) . Cependant, si vous utilisez cette méthode sur l'objet Response et que le cookie pas existe, alors ce cookie sera créé.

Voir Référence MSDN pour Méthode HttpCookieCollection.Get (String)

30
zmbq

Parfois, vous avez encore besoin de savoir si un cookie existe dans Response. Ensuite, vous pouvez vérifier si la clé de cookie existe:

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

Plus d'informations peuvent être trouvées ici .

Dans mon cas, j'ai dû modifier Response Cookie dans la méthode Application_EndRequest dans Global.asax. Si Cookie n'existe pas, je n'y touche pas:

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

Il y a beaucoup de bonnes réponses ici en fonction de ce que vous essayez d'accomplir; voici ma tentative de fournir une réponse complète:

Les objets Request et Response contiennent les propriétés Cookies, qui sont des objets HttpCookieCollection.

Request.Cookies:

  • Cette collection contient des cookies reçus du client
  • Cette collection est en lecture seule
  • Si vous essayez d'accéder à un cookie non existant de cette collection, vous recevrez une valeur null.

Response.Cookies:

  • Cette collection contient uniquement les cookies qui ont été ajoutés par le serveur lors de la demande en cours.
  • Cette collection est accessible en écriture
  • Si vous tentez d'accéder à un cookie non existant de cette collection, vous recevrez un nouvel objet cookie. Si le cookie auquel vous avez tenté d'accéder N'EXISTE PAS dans la collection Request.Cookies, Il sera ajouté (mais si le Request.Cookies Objet contient déjà un cookie avec la même clé et, même si sa valeur est périmée, il ne sera pas mis à jour pour refléter les modifications apportées au cookie nouvellement créé dans la collection Response.Cookies.

Solutions


Si vous souhaitez vérifier l’existence d’un cookie du client, effectuez l’une des opérations suivantes:

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

Si vous souhaitez vérifier l'existence d'un cookie ajouté par le serveur lors de la demande en cours, procédez comme suit:

  • Response.Cookies.AllKeys.Contains("COOKIE_KEY") (voir ici )

Tentative de recherche d’un cookie ajouté par le serveur lors de la demande en cours par l’une de ces méthodes ...

  • Response.Cookies["COOKIE_KEY"] != null
  • Response.Cookies.Get("COOKIE_KEY") != null (voir ici )

... entraînera la création d'un cookie dans la collection Response.Cookies et l'état sera évalué à true.

37
Trevor

Vous devez utiliser HttpContext.Current.Request.Cookies, ne pas Response.Cookies.

Note latérale: les cookies sont copiés dans Request sur Response.Cookies.Add, qui vérifie que l'un ou l'autre se comporte de la même manière pour les cookies récemment ajoutés. Mais les cookies entrants ne sont jamais reflétés dans Response.

Ce comportement est documenté dans la propriété HttpResponse.Cookies :

Une fois que vous avez ajouté un cookie à l'aide de la collection HttpResponse.Cookies, celui-ci est immédiatement disponible dans la collection HttpRequest.Cookies, même si la réponse n'a pas été envoyée au client.

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;
    }
}

Usage:

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

Désolé, pas assez de rep pour ajouter un commentaire, mais de la réponse de zmbq:

Quoi qu'il en soit, pour voir si un cookie existe, vous pouvez vérifier Cookies.Get (chaîne), cela ne modifiera pas la collection de cookies.

n’est peut-être pas tout à fait correct, car Cookies.Get (chaîne) créera en réalité un cookie portant ce nom, s’il n’existe pas déjà. Cependant, comme il l'a dit, vous devez regarder Request.Cookies, pas Response.Cookies. Ainsi, quelque chose comme:

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

Vous pouvez faire quelque chose comme ceci pour connaître la valeur des cookies:

Request.Cookies[SESSION_COOKIE_NAME].Value
0
Hernan Bogantes