http cookie的domain使用

  问题描述

  最近遇到了一个因cookie domain设置不正确导致公司自研的分布式session组件无法生效的问题。

  公司自研的这套分布式session组件依赖于设置在cookie中的sessionId,请求到后端时经过特定的filter处理,当发现cookie中不存在指定的sessionId值时,会重新生成一个sessionId种入到cookie中,如果存在就根据该sessionId的值从redis缓存中取出该值对应的session内容。

  但是组内一个服务接入这个组件自测的时候,发现每次请求都无法取到上一次session的值,排查后发现每一次请求中根本没有带上上一次cookie中种下的sessionId,导致每次请求否会生成一个新的sessionId。而每一次请求没有带上上一次请求的sessionId的原因在于该cookie值得domain设置不符合要求,导致cookie设置失败。

  1、当请求到后端时,发现cookie中没有sessionId,会重新生成sessionId并种到cookie中,如下图:

  

 

  2、请求没有带上上一次请求响应时设置在cookie中的sessionId,并重新生成sessionId,如下图:

  

 

  问题定位

  cookie中sessionId的domain设置不符合规范,导致该cookie值设置失败。虽然在浏览器中看到请求的相应中已经设置了cookie sessionId,但是这并不代表该cookie值设置成功,这仅仅表示了设置cookie值的动作。

  问题分析

  cookie domain的设置规则

  只能设置为当前域名及其父域名,否则无效。

  例如,一个服务的域名为dev.service.abc.com,cookie的domain设置可以为:dev.service.abc.com、.service.abc.com、.abc.com

  不能设置为.com、.cn、.net等

  不设置domain,默认domain为当前域名

  结合问题

  服务代码中该sessionId的cookie domain设置为如.abc的形式,和cookie domain设置为.com、.cn、.net是一个道理,不符合cookie domain的设置规则,这样设置cookie是无效的,因此请求无法带上一次设置的sessionId,因此上一次sessionId根据就没有成功种入到cookie中。

  cookie domain使用扩展

  Cookie中domain的一个最为重要和常见的作用就是实现cookie跨域共享。

  在qiye.epro.sogou.com域下种下cookie:cookieName=cookieValue,domain=.sogou.com,这样:其他以.sogou.com为后缀的域名对应的服务就可以获取到该cookie信息,例如: qyyun.epro.sogou.com、 h5-qiye.epro.sogou.com、www.sogou.com等,实现了cookie信息的跨域共享。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: CookieDomain属性用于指定可以访问该Cookie的域名范围。默认情况下,CookieDomain属性值为请求的地址。如果要在多个域名之间共享Cookie,可以将CookieDomain属性设置为这些域名的公共父域名。例如,如果域A为t1.study.com,域B为t2.study.com,要在这两个域名之间共享Cookie,就需要将CookieDomain属性设置为.study.com。这样,两个域名下的网页都可以访问该Cookie。注意,一般在域名前需要加一个".",如"domain=.study.com"。\[2\] 另外,如果在设置Cookie时没有显式声明Domain属性,浏览器会根据当前的域名进行特殊处理。在火狐浏览器中,该Cookie的信息会有一个主机项,而域项会消失。在Chrome浏览器中,虽然有域这个项,但域的前面少了一个点。因此,如果显式声明了Domain属性,不管域中是否带点,到Chrome浏览器中都是带点存储的。只有在没有显式声明域的情况下,浏览器存储的域会去掉点。例如,在e.f.com.cn服务主机中生成的Cookie,只有e.f.com.cn的服务器能够获取到,子域名无法获取到这个Cookie。\[3\] #### 引用[.reference_title] - *1* *2* [cookiedomain属性](https://blog.csdn.net/longgege001/article/details/81274088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [前端----cookie的域:domain](https://blog.csdn.net/q5706503/article/details/83046884)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值