前言

最近接手的项目中 ,有人反馈了一个问题,说是在访问网站并登录后,登录成功有登录信息,但是刷新页面后重定向到了登录页面,让从新登录。

打开 goole 调试页面,查看 cookie 时发现存储的相关 token 信息不见了。

原本以为 cookie 有效期有问题,但经过排查 cookie 失效为 7 天,也没有清除 cookie 的逻辑。

经排查发现:我们在输入访问 hew.cn 的时候,刷新页面网址变成了www.hew.cn 导致原本存储在 hew.cn 域名下的 cookie 信息没有同步到www.hew.cn下。

也就是所谓的:二级域名和顶级域名不共享的原因而引起的 cookie

原理

我们往往在开发过程中在存储 cookies 时,不会特意去加上 domain 属性,这样会默认存放在当前域名下。因此我们在访问www.hew.cn页面只会携带上,存放在当前域名下的token信息,而我们通过浏览器输入www.hew.cn其实访问的顶级域名是hew.cn,二者是父子级其实是关系。

我们这样存储 cookie 会二级子域名下的 cookie 和顶级域名不共享的。同理 a.hew.com 下设置 cookie, 在 b.hew.com 下也是无法正常使用的

要避免这样的原因,我们就需要设置 cookie 的 domain

cookie 相关配置

属性 介绍
name Cookie 的名称,Cookie 一旦创建,名称便不可更改
value Cookie 的值,如果值为 Unicode 字符,需要为字符编码。如果为二进制数据,则需要使用 BASE64 编码
maxAge Cookie 失效的时间,单位秒。如果为整数,则该 Cookie 在 maxAge 秒后失效。如果为负数,该 Cookie 为临时 Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该 Cookie。如果为 0,表示删除该 Cookie。默认为-1。
secure 该 Cookie 是否仅被使用安全协议传输。安全协议。安全协议有 HTTPS,SSL 等,在网络上传输数据之前先将数据加密。默认为 false。
path Cookie 的使用路径。如果设置为“/sessionWeb/”,则只有 contextPath 为“/sessionWeb”的程序可以访问该 Cookie。如果设置为“/”,则本域名下 contextPath 都可以访问该 Cookie。注意最后一个字符必须为“/”。
domain 可以访问该 Cookie 的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该 Cookie。注意第一个字符必须为“.”。
comment 该 Cookie 的用处说明,浏览器显示 Cookie 信息的时候显示该说明。
version Cookie 使用的版本号。0 表示遵循 Netscape 的 Cookie 规范,1 表示遵循 W3C 的 RFC 2109 规范

通过上方 cookie 相关配置我们可以看到 domain 属性 可以有效进行一二级域名共享 cookie

代码实现

<script>
document.cookie="name=value;domain=hew.cn";
</script>

简单封装一个获取、设置、删除 cookie 的工具类 CookieTool

        /**
* @params name cookie键
* @params value cookie值
* @params days cookie过期时间
*/
export function setCookie(name, value, days) { var domain, domainParts, date, expires, host;
// 设置过期时间 格林威治时间 (GMT)
if (days) {
date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toGMTString();
} else {
expires = "";
} // 获取域名
host = location.host;
if (host.split('.').length === 1) {
document.cookie = name + "=" + value + expires + "; path=/; domain=." + host;
} else {
domainParts = host.split('.');
domainParts.shift();
domain = '.' + domainParts.join('.');
document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain;
if (getCookie(name) == null || getCookie(name) != value) {
domain = '.' + host;
document.cookie = name + "=" + value + expires + "; path=/; domain=" + domain;
}
}
} export function getCookie(name) {
var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)")
if (arr = document.cookie.match(reg))
return unescape(arr[2])
else
return null
} export function delCookie(name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval = getCookie(name);
if (cval != null)
document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}
</script>

js实现一二级域名共享cookie的更多相关文章

  1. 顶级域名和二级域名共享cookie及相互删除cookie

    在CSDN看到一个cookie设置domain时,如何删除的问题, 自己也只知道domain设置为顶级域名时可以被其他二级域名共享,但是如何删除还是有一点搞不清楚,所以特意测试了下cookie和dom ...

  2. Js跨一级域名同步cookie

    1. 纯Js同步两个域名下的cookie document.cookie = "name=" + "value;" + "expires=" ...

  3. php的cookie和session相同主域名共享

    如何使用chrome查看cookie和session详见另一篇文章,点这里 首先说cookie, $cookieDomain = '.elf.com'; setcookie('elf', 'im el ...

  4. 设置二级域名共享一级域名Cookie和删除共享Cookie

     设置共享Cookie: 二级域名要想共享一级域名的cookie,只需要设置cookie.Domain = ".一级域名.com";   删除共享Cookie:  HttpCook ...

  5. asp.net 二级域名表单认证情况下共享Cookie

    二级域名之间共享Cookie,很重要的一点就是配置,如下: domain设置为.ahdqxx.com,如果你的域名是www.ahdqxx.com,mall.ahdqxx.com,那么请设置你的doma ...

  6. 不同三级域名与二级域名之间互相共享Cookie

    当你在项目中遇到这样一个问题,有多个站点在多个二级级域名如果要实现各域名站点下的登录状态共享,那么最简单的方法就是共享Cookie. 首先声明几个概念,域名怎么去区分. 顶级域名:.com,.cn,. ...

  7. js实用方法记录-简单cookie操作

    js实用方法记录-简单cookie操作 设置cookie:setCookie(名称,值,保存时间,保存域); 获取cookie:setCookie(名称); 移除cookie:setCookie(名称 ...

  8. Asp.net 子域共享cookie

    最近项目遇到要共享cookie的问题,本来后台保存session用的是Redis来保存数据的.所以只需要2个站点发的ASP.NET_SessionId是相同的就可以,并且它的Domain 是父级域名. ...

  9. asp.net基于StateServer的二级域名共享session

    备注:亲自试验有效,如果网友有通过下面的教程未实现session共享的,欢迎留言说明你遇到的问题.必有回复. 最近为实现的二级域名共享session纠结好久.网上的很多实现的方法试了都不行,查了很久才 ...

  10. .NET二级域名共享Session

    ASP.NET二级域名站点共享Session状态 今天, 我要写的是如何在二级域名站点之间,主站点和二级域名站点之间共享Session. 首先, Session要共享,站点之间SessionID必须要 ...

随机推荐

  1. 2.3 Goland快捷键

    1 新建 Alt + Insert Alt + Enter 2 移动 Alt + 上下箭头:以函数为单位移动 Ctrl + G : 定位到行 Ctrl + W :可以选择单词继而语句继而行继而函数Ct ...

  2. 8、将两个字符串s1,s2进行比较,如果s1>s2,则输出一个正数。如果s1 = s2,输出零。如果s1 < s2, 输出一个负数,不用strcmp函数,输出的正数或者负数的绝对值应该是比较两字符串相应字符的ascii码的差值。

    /* 将两个字符串s1,s2进行比较,如果s1>s2,则输出一个正数.如果s1 = s2,输出零.如果s1 < s2, 输出一个负数,不用strcmp函数,输出的正数或者负数的绝对值应该是 ...

  3. 自学 TypeScript 第三天 使用webpack打包 TS 代码

    前言: 大家好啊,昨天介绍了 TS 编译器的配置,但在我们实际开发当中直接使用 TS 编译器去编译代码的情况会有,但没有很多,因为我们在开发大型项目的时候,一般我们都会用到打包工具,也不可能脱离打包工 ...

  4. Visual Studio高版本 ArcObject for .Net 低版本

    在基于ArcGIS的开发中,经常会存在Visual Studio版本高,ArcObject for .Net 版本低的问题.例如Visual Studio 2015的环境下,安装ArcObject f ...

  5. 编译器优化丨Cache优化

    摘要:本文重点介绍几种通过优化Cache使用提高程序性能的方法. 本文分享自华为云社区<编译器优化那些事儿(7):Cache优化>,作者:毕昇小助手. 引言 软件开发人员往往期望计算机硬件 ...

  6. 直播报名|资深云原生架构师分享服务网格在腾讯 IT 业务的落地实践

    云原生在近几年的发展越来越火热,作为云上最佳实践而生的设计理念,也有了越来越多的实践案例,而一个个云原生案例的背后,是无声的巨大变革. 腾讯云主办首个云原生百科知识直播节目--<云原生正发声&g ...

  7. LeetCode HOT 100:子集(简单易懂的回溯)

    题目:78. 子集 题目描述: 给你一个整数数组,数组中元素互不相同.返回数组中所有可能的子集,且子集不能重复! 什么是子集?举个例子:原数组[1, 2, 3],[].[1].[1, 2].[1, 3 ...

  8. python Flask 操作数据库

    Flask数据库 转载:Flask数据库 - 苦行僧95 - 博客园 (cnblogs.com) Flask-SQLAlchemy Flask-SQLAlchemy是在Flask中操作关系型数据库的拓 ...

  9. if多条件判断

    在一个if语句中,括号里面包含多个条件时.条件是否被执行要看if语句里面各个条件是"与"的关系还是"或"的关系. #include<stdio.h> ...

  10. java计算器༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽༼༎ຶᴗ༎ຶ༽,又是掉发的一天

    题目: 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值. 注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() . 示例 1: 输入:s = " ...