http cookie及子域名共享

cookie工作原理

cookie

如上图所示,客户端浏览器请求服务器端(由上往下次序),如果是首次请求,在http请求头中的cookie为空,服务端接收到该请求时,先对传递过来的cookie信息进行甄别,因为cookie为空,服务端认为此次会话为首次会话,会在http返回头中嵌入set-cookie,即返回cookie值;如果非首次请求,并且请求的cookie未过期或被禁掉,那么此次的http请求头中会带上cookie值一同提交到服务端,而服务端依然对其cookie进行识别校验,如果发现该用户验证通过,那么返回指定的动作给客户端继续执行操作,否则会拒绝本次请求并生成新的会话。

 

cookie的几个属性

name

Cookie的名称,Cookie一旦创建,名称便不可更改

value

Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码

maxAge

Cookie失效的时间,单位秒

如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。

如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为-1。

如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除,

response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。

要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie(domain、path必须相同),达到修改的目的。删除时只需要把maxAge修改为0即可。

从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。

secure

该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。

path

Cookie的使用路径。如果设置为“/sps/”,则只有contextPath为“/sps”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”

domain

可以访问该Cookie的域名。domain 选项的值必须是发送 Set-Cookie 消息头的主机名的一部分,不合法的 domain 选择将直接被忽略。
如果设置为“.a.com”,则所有以“a.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。将一个 cookie 的 domain 选项设置为 .a.com,就可以将该 cookie 的值发送至所有这些站点。浏览器会把 domain 的值与请求的域名做一个尾部比较(即从字符串的尾部开始比较),并将匹配的 cookie 发送至服务器。

Cookie是不可跨域名的。域名www.a.com颁发的Cookie不会被提交到域名www.b.com去。这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie。

正常情况下,同一个一级域名下的两个二级域名如www.b.com和c.b.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想所有b.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数为.b.com

注意:domain参数必须以点(".")开始。另外,name相同但domain不同的两个Cookie是两个不同的Cookie。如果想要两个域名完全不同的网站共有Cookie,可以生成两个Cookie,domain属性分别为两个域名,输出到客户端。

comment

该Cookie的用处说明,浏览器显示Cookie信息的时候显示该说明

 

案例

为了让ir.tg.oo.com域名用户能直接访问tg.oo.com而不用登陆,即实现子域名之间共享,跨域访问,我们设置cookie的domain name为"."+request.getServerName()。

生产环境的域名为tg.oo.com(虚构的),其cookie domain name为.tg.oo.com。我们分别配置hosts,测试环境域名为test.tg.oo.com,开发环境配置的域名为dev.tg.oo.com,这样测试环境生成的cookie domain name为.test.tg.oo.com,生产环境的cookie domain name为.tg.oo.com

好像没什么问题,可是项目上线后发现测试环境经常出现无法登陆的问题,查看cookie发现,测试环境竟然有两个名字相同的cookie,但是domain name一个为.test.tg.oo.com,一个为.tg.oo.com,一开始我们很纳闷为什么会有两个cookie呢,按理程序只应该写一个.test.tg.oo.com的cookie,.tg.oo.com是怎么来的呢?经过仔细思考发现,测试环境之所以有两个cookie,是因为test.tg.oo.com是tg.oo.com的子域名,同时登录生产环境和测试环境导致测试环境共享了生产环境的cookie,从而引发登录的问题。

解决方法也很简单,把测试环境和开发环境的三级域名改为二级域名,比如test.tg.oo.com修改为testtg.oo.com,dev.tg.oo.com改为devtg.oo.com,这样就不会出现测试环境共享线上环境的cookie引发无法登录的问题了。

# http 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×