正确使用cookie中的domain

 看规则,尝试使用规则,记录问题,多次使用使之熟练。今天发现vue中的this.$router.push()不熟悉了。做记录并不代表不会忘,只是为了能够理清逻辑,加深印象。

本文内容有复制粘贴其他博主的内容,在此谢过了。

问题:

今天遇到一个不新但是不常用的技术:cookie。做统一登录平台,要求实现统一登录平台登录之后,其他平台都可以直接登录进入登录状态,不用再登录了。他们提的技术方案是用cookie,对于这个cookie我是不怎么熟悉的,因为很多在本地存数据的方案我都是直接用的sessionStorage或者localStorage,今天有一点倒是我以前没有想到,没有用到的,sessionStorage在一个页面存入之后,在同一个浏览器的其他网页是不会有的,所以导致只能用cookie,至于有没有其他更好的方案就有待研究了。

引用内容

所谓的单一登录是指用户在一个站点如www.studyez.com登录后切换到另一个站点communty.studyez.com时也自动 被community的Server判断为已经登录,反过来,只要用户在community.studyez.com登出后,切换到 www.studyez.com时后www的Server也会判断到这一用户已经登出。

限制条件:
1.所有要求单点登录的站点间共享同一用户数据库,这点应该不需要任何解释的吧。

2. 要求所有站点在同一父域名之下。这里所说的单点登录是指在同一个域名下不同子域名之间的单点登录,直接的例子就是像这样的站点之间的跨站单点登 录: www.studyez.com, community.studyez.com, serach.studyez.com, mail.studyez.com, mms.studyez.com 等, 他们属于一个共同的父域名studyez.com, 之所以有这么多子域名,是因为有很多子系统的时候用不同的子域名对于开发、部署和管理都能方便很多, 而且对于用户访问量很大的站点,可能每个子域名都会有很多的服务器来伺服。这是比较符合目前很多站点的模式和需求的。

对于非同一父域名下的域名间跨站登录,最好的方式是采用Passport的原理来实现,具体实现可以参考Passport文档,因此不在本文讨论范围之内。

原理:

不同的子域名之间实现单点登录的最佳途径是采用Cookie的Forms认证。他的原理简单的来说,就是让Forms Authentication生成的Cookie能够跨域名访问。

先谈一下Cookie的限制,对于一个任何Http Request来说,提交给Server端的时候,它能够安全访问的Cookie的域名必须在这个HTTP Reuqest的域名路径中。举例来说,发出一个http://communiy.corp.studyez.com/的 请求时,随着这个http request一块发送到server端的cookies会 自动包括 所有 以 community.corp.studyez.com, .corp.studyez.com, corp.studyez.com, .studyez.com, studyez.com 为域名的Cookies,这是由Cookie本身的规范所限制的,浏览器如果不是按照这个规范实现,那么就会存在严重安全漏洞,因为那样的话意味着任何一 个服务器都可以读到同一个用户访问别的网站时留下的Cookie。

根据上面所述Cookie的限制性,可以得出,对于前面 www.studyez.com, community.studyez.com等站点的例子来说,就是想办法如何让 Forms Authentication生成的Cookie的域名限定为.studyez.com或者studyez.com,而不是默认的 www.studyez.com 和 communty.studyez.com,这样就使得单一登录需求的实现成为可能。

 

    domain的含义为域,分为子域和父域,子域可以访问本级域名及父级域名的下的cookie

假设有两个域名

    a.b.e.f.com.cn  以下用域名1指代此域名

    c.d.e.f.com.cn   以下用域名2指代此域名

在域名中,所有域名进行分级,也就是说域名1与域名2都是f.com.cn的子域名,f.com.cn又是com.cn的子域名

在域名1所使用的服务中,可以设置域名

    a.b.e.f.com.cn

    b.e.f.com.cn

    e.f.com.cn

    f.com.cn

于域名1下的cookie,域名2可以拿到e.f.com.cn,f.com.cn这两个domain下的cookie,互联网上说的单点登录,就是以这个原理实现的。

如果存在相同名的cookie不同domain呢?(不同域名下的cookie可以同名,同域名下的cookie同名会被替换)

比如域名1设置设置domain为e.f.com.cn的cookie,mykey=myvalue1。

而在域名二中设置domain为c.d.e.f.com.cn的cookie,mykey=myvalue2。

此时在域名2服务端能拿到两个cookie都为mykey=myvalue,并不存在覆盖一说。

注意在域名2中如果设置domain为e.f.com.cn的cookie,mykey=myvalue3.此时会覆盖域为e.f.com.cn的mykey的值,即浏览器中,同一个域,只存在一个名为mykey的cookie。

 如果不显式设置cookie,默认当前域名这种说法对不对呢? 

    先说第一个问题,如果不显示设置cookie,那么浏览器会生成一个只针对当前域名的cookie,什么叫只针对当前域名呢?

如果有一个域名就是e.f.com.cn,在该域名下设置的cookie如果没有显示domain,在回写浏览器的时候浏览器会特殊处理,如果是火狐,你会发现该cookie的信息,有一个主机项,而域项消失了,在chrome中,虽然有域这个项,但是域的前面少了一个点,就是上面所说的,如果显示声明,不管域中带不带点,到chrome中,都是带点存储的,只有非显式声明域的cookie,浏览器存储才是不带点的,问题就在这,在e.f.com.cn服务主机中生成的cookie,只有e.f.com.cn的服务器能拿到,此时子域名是拿不到这个cookie得。

解决:

 document.cookie=`userName=${this.name};domain=30.18.22.75;`

    一开始没有设置path,但是我vue的项目中配置了静态资源的默认路径

dev: {
    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/oum/',//这里进行了开发环境的配置

.......

build: {
    // Template for index.html
    index: path.resolve(__dirname, '../dist/index.html'),

    // Paths
    assetsRoot: path.resolve(__dirname, '../dist'),
    assetsSubDirectory: 'static',
    assetsPublicPath: '/oum/',//这里进行了生产环境的配置

导致浏览器中cookie的path为/oum,这样在浏览器中打开同域名的其他项目是找不到userName这个cookie的

所以正确的做法是配置一下path

 document.cookie=`userName=${this.name};domain=30.18.22.75;path=/;`

至于cookie的配置这些用另外一个博客记录。

  • 19
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 这个错误是因为浏览器cookie域名与服务器返回的cookie域名不匹配导致的。可能是因为你的网站使用了多个子域名,而cookie的域名设置不正确,导致浏览器无法正确识别cookie。需要检查cookie的域名设置是否正确,并确保所有子域名都使用相同的cookie域名。 ### 回答2: “cookie 'domain' mismatch”指的是在浏览网站时出现的错误提示,其涉及到浏览器上的cookie机制和网站域名的概念。当我们访问某个网站时,网站会在我们的浏览器上存储一些cookie,以便下次访问时能够识别用户身份和记录用户偏好等信息。而每个cookie都有其所属的域名属性,指定了该cookie的作用域范围。例如,访问"www.example.com"域名的网站时,所存储的cookie的域名属性应该为“example.com”。 当出现“cookie 'domain' mismatch”错误提示时,通常是因为网站域名和cookie所属域名不匹配造成的。这可能是由以下几个原因造成的: 1. 浏览器设置问题:某些浏览器设置可能会禁用网站存储cookie或者限制cookie的作用域范围,从而导致出现该错误提示。 2. 网站跳转问题:当网站进行跳转操作时,如果域名发生了变化,那么之前存储的cookie可能无法正确识别,从而导致出现该错误提示。 3. 域名解析问题:有时候,由于DNS解析不准确或者域名绑定配置错误,浏览器可能无法正确解析网站域名,进而导致cookie 'domain' mismatch错误。 如果您遇到了cookie 'domain' mismatch错误提示,您可以尝试清除浏览器缓存并重新刷新网页,或者检查浏览器cookie设置是否正确。如果问题依然存在,您可以尝试更换浏览器或者联系网站管理员进行排查和解决。 ### 回答3: cookie 'domain' mismatch是指浏览器无法设置带有指定域名的cookie,因为请求的域名与cookie的域名不匹配。这个问题通常会出现在跨域请求、子域名或者多个域名之间的会话。 当浏览器向服务器发送请求时,如果请求的域名与cookie的域名不匹配,那么服务器会拒绝设置该cookie,因为这可能是恶意站点试图窃取用户信息的攻击。因此,浏览器会报出“cookie 'domain' mismatch”的错误信息。 解决这个问题的方法很简单,只需要在设置cookie时确保指定的域名与请求的域名匹配即可。如果您正在使用JavaScript设置cookie,可以在代码指定cookie的域名,如下所示: document.cookie = "cookie_name=cookie_value; domain=example.com; path=/"; 在这个例子,我们将cookie的域名设置为example.com。当浏览器向example.com发送请求时,该cookie将被发送到服务器。 总的来说,cookie 'domain' mismatch是一个基本的网络安全问题,但是通过小心的编码和检查,可以很容易地避免这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值