题记:一个cookie,整个下午都没有找到解决的办法。
一、遇到的问题
1. 情景:访问http://list.mall.daily.taobao.net/50024400/xxx,当前页面通过ajax请求广告,请求的域为http://tmatch.simba.taobao.com/xxx;广告引擎向页面种seesion范围的cookie名_back,用于标识翻页;
2. 问题:
点击当前页面的翻页,IE下广告不翻页?通过firebug与httpwatch对比,发现IE下cookie“_back”不正确。开始猜测是引擎种cookie的逻辑存在问题,但很多地方都在使用此接口,均没有问题。
且有人的机器翻页正常,此时怀疑是浏览器设置问题?再用httpwatch观察“http请求头”,发现_back没有回传给引擎(其实httpwatch的cookies也可以观察到,如果发送cookie的话,会显示为Sent;之前只观察到Received)? 确认是浏览器的问题。
3. 解决:打开IE隐私设计,通常默认设置为“中”,拒绝“没有隐私政策的第三方cookie ...”,意味着_back并没有成功写入客户端,所有请求引擎导致不能正确回传_back,翻页失败。
这么说淘宝所有的广告的翻页都是不可用的 ?肯定不是。问题在”第一方 Cookie 来自您正浏览的网站,它们可以是永久的或临时的;第三方 Cookie 来自您正浏览的网站上的其他网站的广告”,对于浏览器“taobao.net与taobao.com”就是不同的两个网站,所以引擎的_back是无法种在客户端。此情景是daliy环境,线上的环境访问的是list.mall.daily.taobao.com,所以不存在“第三方cookie”的概念,广告是可以正确显示。
二、关于cookie小知识
1.IE Cookie的格式
第一行“名称”,第二行“值”,第三行“所属域” ...比如“.taobao.com”存在cna,此cookie会被浏览器自动发送到任何属于此域的子域;www.taobao.com\taobao.com,后面的是根域,前一个是二级域。xp存放目录为:C:\Documents and Settings\<username>\Cookies\,文件命名:你的用户名@生成COOKIE的domain[COOKIE改变的次数].txt
参考:http://blog.csdn.net/zhangxinrun/archive/2010/07/31/5779574.aspx
2.Js Cookie跨域访
http://blog.csdn.net/tongdoudpj/archive/2009/05/10/4166096.aspx
3.cookie与session的关系
根本的原因:http协议的无状态性,cookie的出现就是为了解决这个问题。
session是一种在客户端与服务器之间保持状态的解决方案。服务端存储内容,返回对应的key给客户端,当下次访问时,带上此key,实现状态的维持。
session实现:
1.依赖cookie,The session cookie is stored in temporary memory and is not retained after the browser is closed。(实际测试:IE8,未在1描述的位置找到session级别cookie对应的文件,猜测‘临时存储在浏览器内存’,当关闭浏览器时则丢失key)
2.url重写。Servlet规范定义此功能。当浏览器禁用cookie时,就算session级别的内容也不会被存储。resp.encodeRedirectURL(url),且仅当禁用cookie时有效,重写结果如:http://www.demo.com/cookie.do;jsessionid=19gfy1sg740dl1whwd72lbqlhb
疑问:server如何判断,是否需要重写呢?从实验现象看,判断是否收到name=JSESSIONID 的cookie,若无,则进行url重写。
最好的方式,翻翻tomcat、jetty的源码实现,但未找到对应的代码。
关于cookie的详细信息参见: http://en.wikipedia.org/wiki/HTTP_cookie