前端存储方式
‘壹’ 城市交通路口的监控录像,一般可以保留多长时间
通常将其保存三个月,但可能会更长。 主要原因是要查看监视视频的主机硬盘的大小,但是不能重复使用一个月。 如今,由于技术的发展,存储设备的更新,前端存储的使用方式已基本取代了中央存储,设计参数已超过两个。 十字路口和街道监视有所不同。该国没有统一的法规。监视和设置时间从一到两个月不等。
‘贰’ 前端本地存储有几种方式
三种:localStorage、sessionStorage、token
‘叁’ web图片一般存在后端哪里
web图片一般存在java后端。
web前端上传图片到Java后端,并保存到本地。一般来说,图片在后端的存储方式分为两种:一,可以将图片以独立文件的形式存储在服务器的指定文件夹中,再将路径存入数据库字段中,二,将图片转换成二进制流,直接存储到数据库的Image类型字段中。
‘肆’ 前端储存和本地储存有哪些区别
1、前端存储
所谓前端存储,是在网络视频监控系统的前端设备(如网络视频编码器或网络摄像机)中内置存储部件,由前端设备直接完成监控图像的本地录制和保存。
前端存储具有几个方面的优势:一是可以通过分布式的存储部署,来减轻集中存储带来的容量压力;二是可以有效缓解集中存储带来的网络流量压力;三是可以避免集中存储在网络发生故障时的图像丢失。
对于前端存储,由于单个前端编码设备通常所带监控点路数不多,存储时间也不长,所以对存储容量要求不高,网络摄像机一般用CF卡或SD卡,视频服务器一般用内置硬盘。这与以往单机存储相比,基本没有区别。
而与以往单机存储本质上不同的是,为了保证用户访问的灵活性和便捷性,网络视频监控系统中的所有前端存储除了要能够提供点对点的单机访问外,还要能够通过一个统一的接口提供所有内容的集中共享。为此,网络视频监控系统通过中心业务平台对所有前端存储进行统一管理和调度,并实现存储空间和存储内容的网络化。这样,用户既可以直接登录单个前端设备进行录像资料的点播回放,也可以统一登录中心业务平台进行所有前端录像资料的集中检索和回放。
2、本地存储
本地存储是指所有视频图像都通过前端接入点的DVR进行分散存储,其优点是投入少,对网络压力最小,缺点是管理复杂,不易维护,重要数据没有安全保证等。在本地存储当中,以DVR为主要的存储设备,因此要求DVR存储的可靠性更强。但是,据有关专家介绍,由于DVR没有完善的组件和磁盘容错机制,无法确保数据的安全性;如果是安装于室内环境还好,但偏偏前端又多处于环境恶劣的室外,以目前的DVR技术水平,如果在室外使用则故障率较高,硬盘容易发生故障,从而造成视频的丢失。因此,本地存储多适合监控点较少、较分散,数据保存周期短,数据安全要求不高的领域,如小型公共场所监控、物业小区视频监控、中小型企业视频监控等。
‘伍’ cookie前端存储有哪几种
1、cookie
HTTP cookie,通常直接叫做cookie,是客户端用来存储数据的一种选项,它既可以在客户端设置也可以在服务器端设置。cookie会跟随任意HTTP请求一起发送。
优点:兼容性好
缺点:一是增加了网络流量;二则是它的数据容量有限,最多只能存储4KB的数据,浏览器之间各有不同;三是不安全。
2、userData
userData是微软通过一个自定义行为引入的持久化用户数据的概念。用户数据允许每个文档最多128KB数据,每个域名最多1MB数据。
缺点:userData不是 web 标准的一部分,只有IE支持。
3、web存储机制
web storage,包括两种:sessionStorage 和 localStorage,前者严格用于一个浏览器会话中存储数据,因为数据在浏览器关闭后会立即删除;后者则用于跨会话持久化地存储数据。
缺点:IE不支持 SessionStorage,低版本IE ( IE6, IE7 ) 不支持 LocalStorage,并且不支持查询语言
4、indexedDB
indexed Database API,简称为indexedDB,是在浏览器中保存结构化数据的一种“数据库”。它类似SQL数据库的结构化数据存储机制,代替了废弃已久的web SQL Database API,它能够在客户端存储大量的结构化数据,并且使用索引高效检索的API。
缺点:兼容性不好,未得到大部分浏览器的支持。
5、Flash cookie
Flash本地存储,类似于HTTP cookie,它是利用 SharedObject类来实现本地存储信息。它默认允许每个站点存储不超过100K的数据,远大于cookie,而且能够跨浏览器。
缺点:浏览器需安装 Flash 控件,毕竟它是通过Flash的类来存储。所幸的是,没有安装Flash的用户极少。
6、Google Gears
Google Gears是Google在07年发布的一个开源浏览器插件,Gears 内置了一个基于SQLite的嵌入式 SQL数据库,并提供了统一API 对 数据库进行访问,在取得用户授权之后,每个站点可以在SQL数据库中存储“不限大小”的数据。
缺点:需要安装 Google Gears 组件
‘陆’ 说一下前端数据存储方式(cookies,localstorage,sessionstorage,indexedDB)的区别
Cookie最初是在客户端用于存储会话信息的,其要求服务器对任意HTTP请求发送Set-CookieHTTP头作为响应的一部分。cookie
以name为名称,以value为值,名和值在传送时都必须是URL编码的。浏览器会存储这样的会话信息,在这之后,通过为每个请求添加Cookie
HTTP头将信息发送回服务器。
localstorage
存储方式:
以键值对(Key-Value)的方式存储,永久存储,永不失效,除非手动删除。
sessionstorage
HTML5 的本地存储 API 中的 localStorage 与 sessionStorage 在使用方法上是相同的,区别在于 sessionStorage 在关闭页面后即被清空,而 localStorage 则会一直保存。
IndexedDB
索引数据库(IndexedDB) API(作为 HTML5 的一部分)对创建具有丰富本地存储数据的数据密集型的离线 HTML5 Web 应用程序很有用。同时它还有助于本地缓存数据,使传统在线 Web 应用程序(比如移动 Web 应用程序)能够更快地运行和响应。
‘柒’ Web前端性能优化的实用技巧汇总
今天小编要跟大家分享的文章是关于Web前端性能优化的实用技巧汇总。javascript在浏览器中运行的性能,可以认为是开发者所面临的最严重的可用性问题。这个问题因为javascript的阻塞性而变得复杂,事实上,多数浏览器使用单一进程来处理用户界面和js脚本执行,所以同一时刻只能做一件事。js执行过程耗时越久,浏览器等待响应的时间越长。
一.提高加载性能
1.IE8,FF,3.5,Safari4和Chrome都允许并行下载js文件,当script下载资源时不会阻塞其他script的下载。但是js下载仍然会阻塞其他资源的下载,如图片。尽管脚本下载不会互相影响,但页面仍然必须等待所有js代码下载并执行完才能继续。因此仍然存在脚本阻塞问题.推荐将所有js文件放在body标签底部以减少对整个页面的影响。
2.减少页面外链脚本文件的数量将会提高页面性能:
http请求会带来额外的开销,因此下载单个300k的文件将比下载10个30k的文件效率更高。
3.动态脚本加载技术:
无论何时启动下载,文件的下载和执行都不会阻塞页面其他进程。
functionlaodScript(url,callback){
varscript=document.createElement('script');_
_cript.type='text/javascript'__f(script.readyState){//ie
____cript.onreadystatechange=function(){_____
if(script.readyState=='loaded'||script.readyState=='complete'){_______
_cript.onreadystatechange=null;_______
callback()_____
____
__
}else{//其他浏览器___
script.onload=function(){_____
_allback()
___}_
}_
script.src=url;_
document.getElementsByTagName('head')[0].appendChild(script);
}
//使用
loadScript('./a.js',function(){_
loadScript('./b.js',function(){___
loadScript('./c.js',function(){_____
console.log('加载完成')___
})_
})
})
4.无阻塞加载类库——LABjs,使用方法如下:
//链式调用时文件逐个下载,.wait()用来指定文件下载并执行完毕后所调用的函数
$LAB.script('./a.js')_
.script('./b.js')_
.wait(function(){__
_pp.init();
})
//为了保证执行顺序,可以这么做,此时a必定在b前执行
$LAB.script('./a.js').wait()_
.script('./b.js')_
.wait(function(){___
_pp.init();
})
二.数据存取与JS性能
1.在js中,数据存储的位置会对代码整体性能产生重大影响。数据存储共有4种方式:字面量,变量,数组项,对象成员。他们有着各自的性能特点。
2.访问字面量和局部变量的速度最快,相反,访问数组和对象相对较慢
3.由于局部变量存在于作用域链的起始位置,因此访问局部变量的比访问跨域作用变量更快
4.嵌套的对象成员会明显影响性能,应尽量避免
5.属性和方法在原型链位置越深,访问他的速度越慢
6.通常我们可以把需要多次使用的对象成员,数组元素,跨域变量保存在局部变量中来改善js性能
三.DOM编程
1.访问DOM会影响浏览器性能,修改DOM则更耗费性能,因为他会导致浏览器重新计算页面的几何变化。<通常的做法是减少访问DOM的次数,把运算尽量留在JS这一端。
注:如过在一个对性能要求比较高的操作中更新一段HTML,推荐使用innerHTML,因为它在绝大多数浏览器中运行的都很快。但对于大多数日常操作而言,并没有太大区别,所以你更应该根据可读性,稳定性,团队习惯,代码风格来综合决定使用innerHTML还是createElement()
2.HTML集合优化
HTML集合包含了DOM节点引用的类数组对象,一直与文档保持连接,每次你需要最新的信息时,都会重复执行查询操作,哪怕只是获取集合里元素的个数。
①_优化一——集合转数组collToArr
functioncollToArr(coll){_
for(vari=0,a=[],len=coll.length;i
a._ush(coll[i]);
__
returna
}
②缓存集合length
③访问集合元素时使用局部变量(即将重复的集合访问缓存到局部变量中,用局部变量来操作)
3.遍历DOM
①使用只返回元素节点的API遍历DOM,因为这些API的执行效率比自己实现的效率更高:
td{border:1pxsolid#ccc;padding:5px;margin:auto;}
td>p{text-align:left;}
td>pspan{text-align:center;display:block;}
属性名
被替代属性
children
childNodes
childElementCount
childNodes.length
firstElementChild
firstChild
lastElementChild
lastChild
nextElementSibling
nextSibling
previousElementSibling
previousSibling
_谘≡衿_PI——querySelectorAll()
querySelectorAll()方法使用css选择器作为参数并返回一个NodeList——包含着匹配节点的类数组对象,该方法不会返回HTML集合,因此返回的节点不会对应实时文档结构,着也避免了HTML集合引起的性能问题。
let_rr=_ocument.querySelectorAll('div.warning,_iv.notice>_')
4.重绘和重排
浏览器在下载完页面的所有组件——html,js,css,图片等之后,会解析并生成两个内部数据结构——_OM树,渲染树.一旦DOM树和渲染树构建完成,浏览器就开始绘制页面元素(paint).
①重排发生的条件:
添加或删除可见的DOM元素位置变化元素尺寸改变内容改变页面渲染器初始化浏览器窗口尺寸变化出现滚动条时会触发整个页面的重排_嘏疟囟ㄖ鼗
5.渲染树变化的排列和刷新
大多数浏览器通过队列化修改并批量执行来优化重排过程,然而获取布局信息的操作会导致队列强制刷新。
offsetTop,offsetWidth...
scrollTop,scrollHeight...
clientTop,clientHeight...
getComputedStyle()
一些优化建议:将设置样式的操作和获取样式的操作分开:
//设置样式
body.style.color='red'
body.style.fontSize=པpx'
//读取样式
letcolor=body.style.color
let_ontSize=_ody.style.fontSize
另外,获取计算属性的兼容写法:
functiongetComputedStyle(el){_
varcomputed=(document.body.currentStyle?el.currentStyle:document.defaultView.getComputedStyle(el,'');_
returncomputed
}
6.最小化重绘和重排
①.批量改变样式
/*使用cssText
*/el.style.cssText='border-left:1px;_order-right:2px;_adding:20px'
②.批量修改dom的优化方案——使元素脱离文档流-对其应用多重改变-把元素带回文档
functionappendDataToEl(option){
vartargetEl=option.target||document.body,___
createEl,___
data=option.data||[];_//让容器脱离文档流,减少重绘重排_
vartargetEl_display=targetEl.style.display;_
targetEl.style.display='none'
_
//*****创建文档片段来优化Dom操作****_
varfragment=document.createDocumentFragment();_//给元素填充数据_
for(vari=0,max=data.length;i
createEl=
document.createElement(option.createEl);___
for(varitemindata[i]){_____
if(item.toString()==='text'){_______
createEl.appendChild(document.createTextNode(data[i][item]));________ontinue;___________
_f(item.toString()==='html'){_______
createEl.innerHTML=item,data[i][item];_______
continue;_____
}_____
_reateEl.setAttribute(item,data[i][item]);_______
//****将填充好的node插入文档片段****___
fragment.appendChild(createEl);___
//****将文档片段统一插入目标容器****_
targetEl.appendChild(fragment);_
//显示容器,完成数据填充_
targetEl.style.display=
targetEl_display;
}
//使用
varwrap=document.querySelectorAll('.wrap')[0];
vardata=[_
_name:'xujaing',text:'选景',title:'xuanfij'},_
{name:'xujaing',text:'选景',title:'xuanfij'},_
{name:'xujaing',text:'选景',title:'xuanfij'}];
appendDataToEl({_
target:wrap,_
createEl:'div',
_ata:data
});
上面的优化方法使用了文档片段:_蔽颐前盐牡灯尾迦氲浇诘阒惺保导噬媳惶砑拥闹皇歉闷蔚淖咏诘悖皇瞧伪旧怼?梢允沟_om操作更有效率。
②.缓存布局信息
//缓存布局信息
letcurrent=el.offsetLeft;
current++;
el.style.left=current+'px'
if(current>300){_
stop();
}
④.慎用:hover
如果有大量元素使用:hover,那么会降低相应速度,CPU升高
⑤.使用事件委托(通过事件冒泡实现)来减少事件处理器的数量,减少内存和处理时间
functiondelegation(e,selector,callback){_
e=e||window.event;_
vartarget=e.target||e.srcElement;
_if(target.nodeName!==selector||
target.className!==selector||target.id!==selector){___
return;
_}_
if(typeofe.preventDefault==='function'){__
_.preventDefault();___
e.stopPropagation();
}else{___
e.returnValue=false;
e.cancelBubble=true;_
}
__allback()}
四.算法和流程控制
1.循环中减少属性查找并反转(可以提升50%-60%的性能)
//for循环
for(vari=item.length;i--){_
process(item[i]);
}
//while循环
varj=item.length;
while(j--){_
process(item[i]);
}
2.使用Duff装置来优化循环(该方法在后面的文章中会详细介绍)
3.基于函数的迭代(比基于循环的迭代慢)
items.forEach(function(value,index,array){__rocess(value);})
4.通常情况下switch总比if-else快,但是不是最佳方案
五.字符串和正则表达式
1.除了IE外,其他浏览器会尝试为表达式左侧的字符串分配更多的内存,然后简单的将第二个字符串拷贝到他的末尾,如果在一个循环中,基础字符串位于最左侧,就可以避免重复拷贝一个逐渐变大的基础字符串。2.使用[sS]来匹配任意字符串3.去除尾部空白的常用做法:
if(!String.prototype.trim){_
String.prototype.trim=function(){___
returnthis.replace(/^s+/,'').replace(/ss*$/,'')_
}
}
六.快速响应的用户界面
1.浏览器的UI线程:用于执行javascript和更新用户界面的进程。
2.在windows系统中定时器分辨率为15毫秒,因此设置小于15毫秒将会使IE锁定,延时的最小值建议为25ms.
3.用延时数组分割耗时任务:
functionmultistep(steps,args,callback){_
vartasks=steps.concat();
__etTimeout(function(){___
vartask=tasks.shift();___
task.apply(null,args||[]);_//调用Apply参数必须是数组
___
if(tasks.length>0){_____
setTimeout(arguments.callee,25);
___else{_____
_allback();___
__
},25);
}
4.记录代码运行时间批处理任务:
functiontimeProcessArray(items,process,callback){_
vartodo=item.concat();__etTimeout(function(){___
varstart=+newDate();
__o{_____
_rocess(todo.shift());___
}while(todo.length>0&&(+newDate()-start<50));
____f(todo.length>0){_____
_etTimeout(arguments.callee,25);
___else{____
_allback(items);_
}_
_,25)
}
5.使用WebWorker:它引入了一个接口,能使代码运行且不占用浏览器UI线程的时间。一个Worker由如下部分组成:
①一个navigator对象,包括app
‘捌’ DVR与NVR哪一个画质好
你好,现在无线监控系统工程也越来越倾向于数字微波,而数字微波的监控后端是采用NVR来录像的,而不是DVR。区别是
两者之间画质问题
NVR是接IPcamera的录像机,所以NVR录像效果是和摄像机相同的。摄像机效果好那么NVR录像机的也有。因为它不需要模拟数字的转换,输出直接就数字压缩视频。
而DVR的录像效果取决于摄像机与DVR本身的压缩算法与芯片处理能力,所以画质一般是会受到一定的影响。
两者扩容问题
DVR系统为模拟前端,监控点与中心DVR之间采用模拟方式互联,因受到传输距离以及模拟信号损失的影响。
而NVR系统为数字前端,监控点设备与NVR之间可以通过任意IP网络互联。
两者布线区别
DVR采用模拟前端,中心到每个监控点都需要布设视频线、音频线、报警线、控制线等诸多线路,稍不留神,哪条线出了问题还需一条一条进行人工排查,因此布线的工作量相当繁琐,并且,工程规模越大则工作量越大,布线成本也越高。
相对比而已,在NVR系统中,中心点与监控点都只需一条网线即可进行连接,免去了上述包括视频线、音频线等在内的所有繁琐线路,成本的降低也就自然而然了。
两者录像存储问题
DVR拥有强大的录像、存储功能,但是这一性能的发挥仍旧受制于其模拟前端,即DVR无法实现前端存储,一旦中心设备或线路出现故障,录像资料就无从获取了。
而市面上的NVR产品及系统可以支持中心存储、前端存储以及客户端存储三种存储方式,并能实现中心与前端互为备份,一旦因故导致中心不能录像时,系统会自动转由前端录像并存储;在存储的容量上,而已NVR也装置了大容量硬盘,并设硬盘接口、网络接口、USB接口,可满足海量的存储需求。
安全性问题
DVR模拟前端传输的音频、视频裸信号,没有任何加密机制,很容易被非法截获,而一旦被截获则很轻易就被显示出来。
目前,NVR产品及系统已经可以通过ACE码流加密,保证网络监控的安全性。
管理问题
DVR因其中心到前端为模拟传输,从而无法实现传输线路以及前端设备的实时监测和集中管理,前端或线路有故障时,要查实具体原因非常不便。
NVR监控系统的全网管理应当说是其一大亮点,它能实现传输线路、传输网络以及所有IP前端的全程监测和集中管理,包括设备状态的监测和参数的浏览。
‘玖’ 鉴权必须了解的 5 个兄弟:cookie、session、token、jwt、单点登录
本文你将看到:
**“前端存储”**这就涉及到一发、一存、一带,发好办,登陆接口直接返回给前端,存储就需要前端想办法了。
前端的存储方式有很多。
有,cookie。cookie 也是前端存储的一种,但相比于 localStorage 等其他方式,借助 HTTP 头、浏览器能力,cookie 可以做到前端无感知。一般过程是这样的:
“配置:Domain / Path”
cookie 是要限制::“空间范围”::的,通过 Domain(域)/ Path(路径)两级。
“配置:Expires / Max-Age”
cookie 还可以限制::“时间范围”::,通过 Expires、Max-Age 中的一种。
“配置:Secure / HttpOnly”
cookie 可以限制::“使用方式”::。
**“HTTP 头对 cookie 的读写”**回过头来,HTTP 是如何写入和传递 cookie 及其配置的呢?HTTP 返回的一个 Set-Cookie 头用于向浏览器写入“一条(且只能是一条)”cookie,格式为 cookie 键值 + 配置键值。例如:
那我想一次多 set 几个 cookie 怎么办?多给几个 Set-Cookie 头(一次 HTTP 请求中允许重复)
HTTP 请求的 Cookie 头用于浏览器把符合当前“空间、时间、使用方式”配置的所有 cookie 一并发给服务端。因为由浏览器做了筛选判断,就不需要归还配置内容了,只要发送键值就可以。
**“前端对 cookie 的读写”**前端可以自己创建 cookie,如果服务端创建的 cookie 没加HttpOnly,那恭喜你也可以修改他给的 cookie。调用document.cookie可以创建、修改 cookie,和 HTTP 一样,一次document.cookie能且只能操作一个 cookie。
调用document.cookie也可以读到 cookie,也和 HTTP 一样,能读到所有的非HttpOnly cookie。
现在回想下,你刷卡的时候发生了什么?
这种操作,在前后端鉴权系统中,叫 session。典型的 session 登陆/验证流程:
**“Session 的存储方式”**显然,服务端只是给 cookie 一个 sessionId,而 session 的具体内容(可能包含用户信息、session 状态等),要自己存一下。存储的方式有几种:
“Session 的过期和销毁”**很简单,只要把存储的 session 数据销毁就可以。****“Session 的分布式问题”**通常服务端是集群,而用户请求过来会走一次负载均衡,不一定打到哪台机器上。那一旦用户后续接口请求到的机器和他登录请求的机器不一致,或者登录请求的机器宕机了,session 不就失效了吗?这个问题现在有几种解决方式。
但通常还是采用第一种方式,因为第二种相当于阉割了负载均衡,且仍没有解决“用户请求的机器宕机”的问题。**“node.js 下的 session 处理”**前面的图很清楚了,服务端要实现对 cookie 和 session 的存取,实现起来要做的事还是很多的。在npm中,已经有封装好的中间件,比如 express-session - npm,用法就不贴了。这是它种的 cookie:
express-session - npm 主要实现了:
session 的维护给服务端造成很大困扰,我们必须找地方存放它,又要考虑分布式的问题,甚至要单独为了它启用一套 Redis 集群。有没有更好的办法?
回过头来想想,一个登录场景,也不必往 session 存太多东西,那为什么不直接打包到 cookie 中呢?这样服务端不用存了,每次只要核验 cookie 带的“证件”有效性就可以了,也可以携带一些轻量的信息。这种方式通常被叫做 token。
token 的流程是这样的:
**“客户端 token 的存储方式” 在前面 cookie 说过,cookie 并不是客户端存储凭证的唯一方式。token 因为它的“无状态性”,有效期、使用限制都包在 token 内容里,对 cookie 的管理能力依赖较小,客户端存起来就显得更自由。但 web 应用的主流方式仍是放在 cookie 里,毕竟少操心。 “token 的过期”**那我们如何控制 token 的有效期呢?很简单,把“过期时间”和数据一起塞进去,验证时判断就好。
编码的方式丰俭由人。**“base64”**比如 node 端的 cookie-session - npm 库
默认配置下,当我给他一个 userid,他会存成这样:
这里的 eyJ1c2VyaWQiOiJhIn0=,就是 {"userid":"abb”} 的 base64 而已。 “防篡改”
是的。所以看情况,如果 token 涉及到敏感权限,就要想办法避免 token 被篡改。解决方案就是给 token 加签名,来识别 token 是否被篡改过。例如在 cookie-session - npm 库中,增加两项配置:
这样会多种一个 .sig cookie,里面的值就是 {"userid":"abb”} 和 iAmSecret通过加密算法计算出来的,常见的比如HMACSHA256 类 (System.Security.Cryptography) | Microsoft Docs。
好了,现在 cdd 虽然能伪造出eyJ1c2VyaWQiOiJhIn0=,但伪造不出 sig 的内容,因为他不知道 secret。**“JWT”**但上面的做法额外增加了 cookie 数量,数据本身也没有规范的格式,所以 JSON Web Token Introction - jwt.io 横空出世了。
它是一种成熟的 token 字符串生成方案,包含了我们前面提到的数据、签名。不如直接看一下一个 JWT token 长什么样:
这串东西是怎么生成的呢?看图:
类型、加密算法的选项,以及 JWT 标准数据字段,可以参考 RFC 7519 - JSON Web Token (JWT)node 上同样有相关的库实现:express-jwt - npm koa-jwt - npm
token,作为权限守护者,最重要的就是“安全”。业务接口用来鉴权的 token,我们称之为 access token。越是权限敏感的业务,我们越希望 access token 有效期足够短,以避免被盗用。但过短的有效期会造成 access token 经常过期,过期后怎么办呢?一种办法是,让用户重新登录获取新 token,显然不够友好,要知道有的 access token 过期时间可能只有几分钟。另外一种办法是,再来一个 token,一个专门生成 access token 的 token,我们称为 refresh token。
有了 refresh token 后,几种情况的请求流程变成这样:
如果 refresh token 也过期了,就只能重新登录了。
session 和 token 都是边界很模糊的概念,就像前面说的,refresh token 也可能以 session 的形式组织维护。狭义上,我们通常认为 session 是“种在 cookie 上、数据存在服务端”的认证方案,token 是“客户端存哪都行、数据存在 token 里”的认证方案。对 session 和 token 的对比本质上是“客户端存 cookie / 存别地儿”、“服务端存数据 / 不存数据”的对比。**“客户端存 cookie / 存别地儿”**存 cookie 固然方便不操心,但问题也很明显:
存别的地方,可以解决没有 cookie 的场景;通过参数等方式手动带,可以避免 CSRF 攻击。 “服务端存数据 / 不存数据”
前面我们已经知道了,在同域下的客户端/服务端认证系统中,通过客户端携带凭证,维持一段时间内的登录状态。但当我们业务线越来越多,就会有更多业务系统分散到不同域名下,就需要“一次登录,全线通用”的能力,叫做“单点登录”。
简单的,如果业务系统都在同一主域名下,比如wenku..com tieba..com,就好办了。可以直接把 cookie domain 设置为主域名 .com,网络也就是这么干的。
比如滴滴这么潮的公司,同时拥有didichuxing.com xiaojukeji.com didiglobal.com等域名,种 cookie 是完全绕不开的。这要能实现“一次登录,全线通用”,才是真正的单点登录。这种场景下,我们需要独立的认证服务,通常被称为 SSO。 “一次“从 A 系统引发登录,到 B 系统不用登录”的完整流程”
**“完整版本:考虑浏览器的场景”**上面的过程看起来没问题,实际上很多 APP 等端上这样就够了。但在浏览器下不见得好用。看这里:
对浏览器来说,SSO 域下返回的数据要怎么存,才能在访问 A 的时候带上?浏览器对跨域有严格限制,cookie、localStorage 等方式都是有域限制的。这就需要也只能由 A 提供 A 域下存储凭证的能力。一般我们是这么做的:
图中我们通过颜色把浏览器当前所处的域名标记出来。注意图中灰底文字说明部分的变化。
谢谢大家哦
‘拾’ 谁能简述三大网络存储
网络存储结构大致分为三种:直连式存储、网络存储设备和存储网络。
1、开放系统的直连式存储(Direct-Attached Storage,简称DAS)已经有近四十年的使用历史,随着用户数据的不断增长,尤其是数百GB以上时,其在备份、恢复、扩展、灾备等方面的问题变得日益困扰系统管理员。直连式存储与服务器主机之间的连接通道通常采用SCSI连接,随着服务器CPU的处理能力越来越强,存储硬盘空间越来越大,阵列的硬盘数量越来越多,SCSI通道将会成为IO瓶颈;服务器主机SCSI ID资源有限,能够建立的SCSI通道连接有限。
2、NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。目前国际着名的NAS企业有Netapp、EMC、OUO等。
3、SAN(Storage Area Network )是一个集中式管理的高速存储网络,由多供应商存储系统、存储管理软件、应用程序服务器和网络硬件组成,能够帮助您充分利用您所拥有的商业信息的价值。由于SAN的基础是存储接口,所以是与传统网络不同的一种网络,常常被称为服务器后面的网络。