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

时间:2014-03-20 16:20:55

标签: c# asp.net cookies

我希望我的页面能够在用户上设置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时,我是否咆哮错误的树?还是我犯了一个新风格的错误?

2 个答案:

答案 0 :(得分:1)

不确定此代码是否正确,但Response.Cookies.Set(CookieChecker);将设置响应浏览器尚未接收和处理。当你在电话Request.Cookies["CookieChecker"];之后立即检查你正在处理的当前请求时 - 浏览器在收到Set-Cookie请求之前生成的请求。

至少需要让浏览器处理响应,然后检查下一个请求以查看cookie是否存在。

答案 1 :(得分:1)

如果您想使用该approch,唯一的方法是使用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'
    }
}