这个Cookie检查器是否可靠地检测用户是否接受Cookie ?



我希望我的页面为用户设置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'
    }
}

最新更新