检查Cookie是否存在

时间:2012-10-24 22:08:09

标签: c# asp.net cookies webforms asp.net-4.0

通过快速搜索 Stack Overflow ,我看到有人建议使用以下方法检查cookie是否存在:

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

或(在Page类中):

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

然而,当我尝试使用索引器(或Cookies.Get方法)来检索不存在的cookie时,似乎实际上创建具有该名称的“默认”cookie并返回因此,无论我使用什么cookie名称,它都不会返回null。 (更糟糕的是 - 创建一个不需要的cookie)

我在这里做错了什么,或者是否有一种不同的方式来简单地通过名称检查特定cookie的存在?

7 个答案:

答案 0 :(得分:49)

有时您仍然需要知道Cookie是否存在于Response中。然后你可以检查cookie密钥是否存在:

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

可以找到更多信息here

在我的情况下,我不得不在Global.asax中的Application_EndRequest方法中修改Response Cookie。如果Cookie不存在,我不会碰它:

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
}

答案 1 :(得分:36)

这里有很多正确的答案取决于你想要完成的事情;这是我尝试提供全面的答案:

RequestResponse对象都包含Cookies个属性,即HttpCookieCollection个对象。

<强> Request.Cookies:

  • 此集合包含从客户端收到的cookie
  • 此系列为只读
  • 如果您尝试从此集合中访问不存在的Cookie,您将收到null值。

<强> Response.Cookies:

  • 此集合仅包含服务器在当前请求期间添加的Cookie。
  • 此系列是可写的
  • 如果您尝试从此集合中访问不存在的cookie,您将收到一个新的cookie对象;如果您尝试访问的Cookie 不会存在于Request.Cookies集合中,则会添加该Cookie(但如果Request.Cookies对象已包含具有相同密钥的Cookie,即使它的值过时,也不会更新它以反映Response.Cookies集合中新创建的cookie的更改。

<强>解决方案

如果要检查客户端是否存在cookie,请执行以下操作之一

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

如果要检查服务器在当前请求期间添加的cookie是否存在,请执行以下操作:

  • Response.Cookies.AllKeys.Contains("COOKIE_KEY")(请参阅here

尝试通过以下方法之一检查服务器在当前请求中添加的Cookie ...

  • Response.Cookies["COOKIE_KEY"] != null
  • Response.Cookies.Get("COOKIE_KEY") != null(请参阅here

...将导致在Response.Cookies集合中创建Cookie,状态将评估为true

答案 2 :(得分:35)

您需要使用HttpContext.Current.Request.Cookies,而不是Response.Cookies

附注:将Cookie复制到Response.Cookies.Add上的请求,这会检查其中任何一个对新添加的Cookie的行为相同。但传入的cookie永远不会反映在Response

HttpResponse.Cookies属性中记录了此行为:

  

使用HttpResponse.Cookies集合添加cookie后,即使响应尚未发送到客户端,cookie也会立即在HttpRequest.Cookies集合中提供。

答案 3 :(得分:29)

Response.Cookies包含将发送回浏览器的Cookie。如果您想知道cookie是否存在,您应该查看Request.Cookies

无论如何,要查看是否存在cookie,您可以查看Cookies.Get(string)但是,如果您在Response对象上使用此方法且Cookie 不存在,则会创建该Cookie。

请参阅HttpCookieCollection.Get Method (String)

的MSDN参考

答案 4 :(得分:4)

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

用法:

Request.Cookies.Exists("MyCookie")

答案 5 :(得分:2)

很抱歉,没有足够的代表添加评论,但是来自zmbq的回答:

  

无论如何,要查看cookie是否存在,您可以检查Cookies.Get(字符串),这不会修改cookie集合。

可能不完全正确,因为Cookies.Get(字符串)实际上会创建一个具有该名称的cookie,如果它还不存在的话。 但是,正如他所说,你需要查看Request.Cookies,而不是Response.Cookies 所以,像:

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

答案 6 :(得分:0)

您可以执行以下操作来查找Cookie的值:

Request.Cookies[SESSION_COOKIE_NAME].Value