burned by cookies

最近在做的项目,老是有个神秘的cookie在不该出现的时候出现,后来经过一番检查,发现问题出现在下列语句

 If Not Response.Cookies(“SomeCookieName”) Is Nothing Then
     ‘ do somthing here
 End If

发现,假如一开始没有“SomeCookieName”这个cookie,Response.Cookies会自动加上一个,验证了一下,

<%
 Response.Write(Response.Cookies.Count & “<BR>”)

 for each i as string in Response.Cookies
     Response.Write(Response.Cookies(i).Name & “<BR>”)
 next

 if not Response.COokies(“hello”) is nothing then

 end if

 Response.Write(Response.Cookies.Count & “<BR>”) ‘多了一个

 for each i as string in Response.Cookies
     Response.Write(Response.Cookies(i).Name & “<BR>”)
 next
%>

Reflector里发现, System.Web.HttpCookieCollection 类的

public HttpCookie Get(string name)
{
      HttpCookie cookie1 = (HttpCookie) base.BaseGet(name);
      if ((cookie1 == null) && (this._response != null))
      {
            cookie1 = new HttpCookie(name);
            this.AddCookie(cookie1, true);
            this._response.OnCookieAdd(cookie1);
      }
      return cookie1;
}
 

确实是如此, 但不是很理解为什么。

当然,也许有人要问,在Response.Cookies里检查某Cookie存在是否恰当?看到编码后,我们发现确实是不太恰当,估计当初是为了赶时间才用了这么一个hack.

在Development Server上,在Staging Server上一切测试都觉得满意后,部署到Live Server上,居然出了问题。反复测试的结果是,在Mozilla FireFox上一切正常,但在IE上有时工作有时不工作。最后用Mozilla FireFox 的Cookie Culler工具发现,有一堆未知的Cookie存在,有时会把我们的Cookie给冲掉,后来才知道他们用了一个第三方公司的ISAPI DLL,用来tracking 用户情况的。这东西大量使用Cookie,少时会产生5个Cookie,多时会产生20个Cookie!大家都知道,在IE里,Cookie是有限制的

一周之内居然被Cookies烧了2次,唉!