看规则,尝试使用规则,记录问题,多次使用使之熟练。今天发现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的配置这些用另外一个博客记录。