繁体   English   中英

检查Cookie是否存在

[英]Check if Cookie Exists

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

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

或(在Page类中):

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

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

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

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

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

更多信息可以在这里找到。

在我的情况下,我不得不在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
}

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

RequestResponse对象都包含Cookies属性,它们是HttpCookieCollection对象。

Request.Cookies:

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

Response.Cookies:

  • 此集合仅包含服务器在当前请求期间添加的cookie。
  • 这个集合是可写的
  • 如果您尝试从此集合中访问不存在的cookie,您将收到一个新的cookie对象; 如果您尝试访问的cookie在Request.Cookies集合中存在,它将被添加(但如果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") (见这里

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

  • Response.Cookies["COOKIE_KEY"] != null
  • Response.Cookies.Get("COOKIE_KEY") != null (见这里

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

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

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

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

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

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

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

有关HttpCookieCollection.Get方法(字符串),请参阅MSDN参考

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")

对不起,没有足够的代表添加评论,但是从zmbq的答案:

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

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

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

你可以做这样的事情来找出cookies的价值:

Request.Cookies[SESSION_COOKIE_NAME].Value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM