![](/img/trans.png)
[英]How to check if a cookie exists even if it was created in another application? (using JS or C#)
[英]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
}
这里有很多正确的答案取决于你想要完成的事情; 这是我尝试提供全面的答案:
Request
和Response
对象都包含Cookies
属性,它们是HttpCookieCollection
对象。
Request.Cookies:
null
值。 Response.Cookies:
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.