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