这个Cookie检查器是否可靠地检测用户是否接受Cookie ?
本文关键字:是否 Cookie 用户 检测 检查 这个 | 更新日期: 2023-09-27 17:51:15
我希望我的页面为用户设置cookie,以便跟踪他们何时以及是否返回,并将他们的唯一访问者id保存在数据库中。我想避免为不接受cookie的用户(如机器人和爬虫)创建cookie记录,所以我需要一种方法来检查他们是否接受cookie。我设计了以下代码:
private bool CookiesAreEnabled()
{
bool result = false;
HttpCookie CookieChecker = new HttpCookie("CookieChecker");
CookieChecker.Value = "Do you see me?";
CookieChecker.Expires = DateTime.Now.AddSeconds(10.0d);
Response.Cookies.Set(CookieChecker);
CookieChecker = new HttpCookie("CookieChecker");
CookieChecker = Request.Cookies["CookieChecker"];
if (CookieChecker != null)
{
result = true;
CookieChecker = new HttpCookie("CookieChecker");
CookieChecker.Value = "";
CookieChecker.Expires = DateTime.Now;
Response.Cookies.Set(CookieChecker);
}
return result;
}
在我看来,这应该检测到cookie被禁用,但它没有!到目前为止,在我使用Firefox关闭cookie的测试中,代码报告cookie是启用的!在检测cookie是否启用方面,我是否找错了方向?还是我犯了一个新风格的错误?
不确定这段代码是否正确,但Response.Cookies.Set(CookieChecker);
将设置浏览器尚未接收和处理的响应。当你调用Request.Cookies["CookieChecker"];
之后,它会检查你正在处理的当前请求——一个浏览器在接收Set-Cookie请求之前生成的请求。
您至少需要让浏览器处理响应,然后检查下一个请求,看看cookie是否存在。
如果你想使用这种方法,唯一的方法是使用2个请求:第一次设置cookie,第二次读取它。你不能只用一个请求来完成。
否则我认为你可以实现它与javascript(这是一个伪代码):
/*first you check if there is already a cookie with the identifier*/
if(document.cookie.indexOf('cookiewithuniqueidentifier') == -1) {
document.cookie = 'testcookie';
cookieEnabled = (document.cookie.indexOf('testcookie') != -1) ? true : false;
if (cookieEnabled) {
/*ajax request to the server for requesting an unique identifier*/
/*save a cookie with that identifier*/
document.cookie='cookiewithuniqueidentifier=936DA01F-9ABD-4d9d-80C7-02AF85C822A8'
}
}