Vérifier si le Cookie existe

À partir d'une recherche rapide sur Stack Overflow j'ai vu des gens suggérer la façon suivante de 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 les Cookies.Get method) pour récupérer un cookie qui n'existe pas, il semble effectivement créer un cookie 'par défaut' avec ce nom et le renvoyer, donc quel que soit le nom du cookie que j'utilise, il ne retourne jamais null. (et pire encore - crée un indésirable cookie)

Est-ce que je fais quelque chose de mal ici, ou Existe-t-il une manière différente de simplement vérifier l'existence d'un cookie spécifique par son nom?

37
demandé sur Acidic 2012-10-25 02:08:08

7 réponses

Response.Cookies contient les témoins qui seront envoyées au navigateur. Si vous voulez savoir si un cookie existe, vous devriez probablement regarder dans Request.Cookies.

, de toute façon, 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 n'existe pas , ce cookie sera créé.

Voir référence MSDN pour HttpCookieCollection.Get Méthode (chaîne)

27
répondu zmbq 2016-12-22 14:50:20

Parfois, vous devez toujours savoir si le Cookie existe en réponse. Ensuite, vous pouvez vérifier si la clé de cookie existe:

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

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

Dans mon cas, j'ai dû modifier le Cookie de réponse dans la méthode Application_EndRequest dans Global.asax. Si le Cookie n'existe pas, Je ne le 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
}
41
répondu marisks 2012-11-07 14:59:02

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

Note latérale: les cookies sont copiés pour Request on Response.Cookies.Add, ce qui permet de vérifier que l'un ou l'autre d'entre eux se comporte de la même manière pour les cookies nouvellement ajoutés. Mais les cookies entrants ne sont jamais reflétés dans Response.

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

Après avoir ajouté un cookie en utilisant HttpResponse.Cookies collection, le cookie est immédiatement disponible dans le HttpRequest.Collecte de Cookies, même si le la réponse n'a pas été envoyée au client.

35
répondu Alexei Levenkov 2014-01-29 21:13:17

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 tous deux des propriétés Cookies, qui sont des objets HttpCookieCollection.

Request.Cookies:

  • cette collection contient les cookies reçus du client
  • Cette collection est en lecture seule
  • Si vous tentez d'accéder à un inexistante témoin de cette collection, vous recevrez un null valeur.

Response.Cookies:

  • cette collection contient uniquement les cookies qui ont été ajoutés par le serveur lors de la requête en cours.
  • Cette collection est accessible en écriture
  • Si vous tentez d'accéder à un cookie inexistant 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 l'objet Request.Cookies contient déjà un cookie avec un la même clé, et même si sa valeur est périmée, elle ne sera pas mise à jour pour refléter les modifications du cookie nouvellement créé dans la collection Response.Cookies.

Solutions


Si vous souhaitez vérifier l'existence d'un cookie sur le 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 voulez vérifier l'existence d'un cookie qui a été ajouté par le serveur pendant la demande actuelle , procédez comme suit:

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

Tentative de vérification d'un cookie qui a été ajouté par le serveur lors de la requête 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.

31
répondu Trevor 2015-09-21 16:55:46
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;
    }
}

Utilisation:

Request.Cookies.Exists("MyCookie")
4
répondu Levitikon 2013-05-06 13:01:12

Désolé, pas assez de représentants 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 les Cookies.Get(string), cela ne modifiera pas la collection de cookies.

N'est peut-être pas tout à fait correct, en tant que Cookies.Get (string) va réellement créer un cookie avec ce nom, s'il n'existe pas déjà. Cependant, comme il l'a dit, vous devez regarder la demande.Cookies, Pas de réponse.Cookies Donc, quelque chose comme:

bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;
2
répondu Fiddles 2013-01-11 06:26:36

Vous pouvez faire quelque chose comme ceci pour trouver la valeur des cookies:

Request.Cookies[SESSION_COOKIE_NAME].Value
0
répondu Hernan Bogantes 2014-10-29 14:29:41