今天同事遇到一个问题,大概描述如下:
浏览器已经接收指令,之前在一级域名下存储了相关的信息。这里为了简化问题,假设我们有两个应用A和B,域名分别为:a.b.com和c.a.b.com。(显然B是A的一个子域)。
上面的描述就是:在.b.com这个一级域名下,我们已经成功写入了一个cookie,假设为:b=level1。
在正常用户的浏览行为中,应用A会向自己的域下写入a=level2(domain:a.b.com)。
在A正常的页面中,有些场景会有异步的请求发出到B应用的页面(用于获取数据),合理的一种想法是:发送到B应用的请求,应该携带着上面的b=level1,a=level2这两个cookie信息到B应用的服务器去才对。但是,实际的情况是,b=level1被如愿携带上来,但是a=level2这个信息却被丢弃了!(确切的说是没有跟着request一起被发送到B的服务端)。
为啥?在访问子域应用时,不是父域名下的cookie都应该被携带上来吗?就像上面的b=level1那样?
其实,关于这点,在cookie的RFC规范中,并没有太明显的说明,至少我没有看到,即使又看了一遍RFC6265中关于Domain Matching的描述也是如此。
但实际的使用过程中,某个域下的cookie如果希望能够被他的子域具有可见性(即可以读取),必须要注意的一点是,应该保证这个cookie在被Set的时候,应该以"."开头。回到上面的例子,之所以a=level2这个cookie没有在用户浏览器请求B应用时被携带到B的server端,就是因为a=level2这个cookie的domain不是.a.b.com,而是a.b.com。
事实上,上面例子中的A应用,在向自己的域名下写入a=level2这个cookie时,压根就没有显示的设置domain这个属性,这样一来,浏览器接受到这个Set Cookie的请求时,就会以默认以当前应用的域名作为cookie的domain。(不过据说某些版本的Firefox到是会自作聪明的在当前域名的前面自动加上一个点,这个待验证!)
这一个小点的区别,还是很容易被忽略的,不过产生的浏览行为还是有细微差别的。(涉及到cookie是否上传,是否占用网络流量等)
PS:关于上面说到的那个问题,stackoverflow上的这个有个截图,看着说明就直观很多了。
分享到:
相关推荐
1. **Domain与Path的匹配**:为了确保安全性,客户端需要确保Cookie的`domain`属性与请求的域名相匹配,并且`path`属性是请求URL路径的前缀。 2. **Max-Age的处理**:`Max-Age`属性定义了Cookie的有效期(单位为秒...
本文将详细介绍ThinkPHP 3.x中的Cookie方法,包括其设置、获取和删除的操作。 一、Cookie方法的用法 在ThinkPHP 3.x中,使用`cookie()`函数来操作Cookie。它接受三个参数: 1. `name`(必需):要操作的Cookie变量...
cookiedomain"] 这个默认为空 想要同步二级域名 那么必须配置 格式如:$ SC["cookiedomain"] ‘ 13980 com’; 然后找到$ SC["default domain"] 在里面写你的域名 如:www 13980 com 2 ...
cookieDomain = tmp.slice(1).join('.'); } // 设置Cookie document.cookie = 'key=value; domain=' + cookieDomain + '; path=/'; ``` 然而,尽管这样可以防止不同环境间的Cookie互相影响,但在读取时,你仍可能...
`domain`参数确保Cookie只在`.apol0829.dev`域下有效,而`prefix`则用于为Cookie名称添加一个独特的前缀。 **删除Cookie** 要删除一个已设置的Cookie,可以再次调用`set_cookie()`函数,但这次将`value`设为空字符...
'cookiedomain' => '' 二、整合方法二(推荐这个) 1: 找到根目录下的 config.inc.php 2: 替换下列数组的值 将 $mulconf = array(); 替换为 $mulconf = array('sysfile' => 'dz60', 'sysuser' => '0', 'sys...
1、配置config.php文件,打开该文件找到$_SC['cookiedomain'],这个默认为空,想要同步二级域名,那么必须配置,格式如:$_SC['cookiedomain'] = ‘.13980.com’;,然后找到$_SC['default_domain'],在里面写你的...
在本文中,我们将深入探讨如何在CodeIgniter (CI)框架中使用helper类库来操作cookie。CI提供了三种操作cookie的方法,而我们将专注于使用helper类库这一种。首先,我们需要了解CI框架的基本结构,它是一个基于MVC...
domain.name // 页面引用静态资源的前缀 member.domain.name // 会员系统跳转域名 cookie.domian.name // 关系到session,本地配置成local server.port // 服务端口 spring.datasource.url // 数据库连接地址 ...
domain.name // 页面引用静态资源的前缀 member.domain.name // 会员系统跳转域名 cookie.domian.name // 关系到session,本地配置成local server.port // 服务端口 spring.datasource.url // 数据库连接地址 ...
1、配置config.php文件,打开该文件找到$_SC['cookiedomain'],这个默认为空,想要同步二级域名,那么必须配置,格式如:$_SC['cookiedomain'] = ‘.13980.com’;,然后找到$_SC['default_domain'],在里面写你的...
这里,`session.cookie_path`设置为根路径,`session.cookie_domain`设置为主域名(包括点前缀),`session.cookie_lifetime`设置Session的生命周期。 2. **修改php.ini配置**: 直接在`php.ini`文件中修改相关...
- `web_reg_add_cookie`用于向测试脚本中添加Cookie。 - Cookie的具体格式需符合HTTP响应头中`Set-Cookie`字段的规定。 - 通过该函数可以模拟用户登录状态或维持会话状态。 以上就是LoadRunner函数中文翻译系列之2-...
数据库表前缀如若更换,在此处更改后,必须结尾加_ 还要在数据库文件中批量挑换对应的表前缀,可以使用TXT和dreamweaver批量替换,不会的自己百度,基本的东西!后台路径修改可以在安装成功后修改,这里修改后,比如...
- **Cookie跨域共享**:通过设置`SameSite`和`Domain`属性,确保用户登录状态在多个子系统间无缝传递。 - **鉴权流程**:用户登录SSO后,获取的认证令牌(Token)被存储在Cookie中,后续请求会携带此Token进行身份...
9. **session.cookie_path** 和 `session.cookie_domain`: 这两个参数可以用来指定Cookie的路径和域,以限制Cookie的有效范围。 10. **session.use_cookies** 和 `session.use_only_cookies`: 分别控制是否使用...
客户端选择不加入Session,例如,如果客户端拒绝接收来自服务器的cookie 作为一个Servlet的开发者,你必须决定你的Web应用是否处理客户机不加入或不能加入Session。服务器会在Web服务器或Servlet规定的时间内维持一...
总结来说,解决ThinkPHP框架下的session跨域问题涉及在服务器配置文件或ThinkPHP框架入口文件中设置session.cookie_domain。开发者需要根据服务器的配置情况选择合适的方法来确保session能够跨域使用。同时,还应该...
以下是代码中涉及的主要知识点: 1. **Cookie操作**: - `setCookie`函数用于设置Cookie,它接受六个参数:`name`(名称),`value`(值),`expires`(过期时间),`path`(路径),`domain`(域名),和`secure`(安全标志)...
$cookiedomain=''; $cookiepath=''; ``` 复制`$cookiepre`后面的值(例如`di0_`),并将其粘贴到会员整合页面的相应字段中。 ##### 4. 完成整合 - 检查所有信息无误后,点击“确定”按钮完成整合过程。 #### ...