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?
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)
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
}
, 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.
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'objetRequest.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 collectionResponse.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
.
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")
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;
Vous pouvez faire quelque chose comme ceci pour trouver la valeur des cookies:
Request.Cookies[SESSION_COOKIE_NAME].Value