什么是无状态呢?就是说本次请求和上一次请求是没有任何关系的,互不认识,没有关联。这种无状态的的好处是快速。但面临的最大问题之一就是如何维持状态,服务器无法知道两个请求是否来自于同一个浏览器。由于http的无状态性,大多数需要登录的网站,为了自由地浏览这个网站下的任意页面,就需要所有网页能够共享某些数据。session和cookie出现了。 客户端访问服务器流程
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure] 紧跟 cookie 值后面的每个选项都以分号和空格分开,每个选择都指定了 cookie 在什么情况下应该被发送至服务器。通过 Set-Cookie 指定的可选项只会在浏览器端使用,而不会被发送至服务器端。
在 JavaScript 中通过 document.cookie 属性,你可以创建、维护和删除 cookie。 document.cookie="name=testname;domain=baidu.com;path=/";
会话 cookie (Session cookie) 在会话结束时(浏览器关闭)会被删除 持久化 cookie(Persistent cookie)在到达失效日期时会被删除 如果浏览器中的 cookie 数量达到限制,那么 cookie 会被删除以为新建的 cookie 创建空间。
简单地说,session 有如用户信息档案表, 里面包含了用户的认证信息和登录状态等信息. 而 cookie 就是浏览器储存在用户电脑上的一小段文本文件,就是用户通行证,session存储于服务器,可以理解为一个状态列表,拥有一个唯一识别符号sessionId,通常存放于cookie中。服务器收到cookie后解析出sessionId,再去session列表中查找,才能找到相应session。cookie类似一个令牌,装有sessionId,存储在客户端,浏览器通常会自动添加。
localStorage的生命周期是永久性的。即使关闭浏览器,数据也不会销毁,存储大小一般为5M,需要主动去销毁,使用方法如下:
javascriptvar localStorage= null;
localStorage= window.localStorage;
localStorage.setItem("name", "testname"); //存储
localStorage.getItem("name"); //获取
localStorage.removeItem("name"); //删除
localStorage.clear();//清除所有数据
localStorage.length;//查看多少条记录
sessionStorage 的生命周期是在浏览器关闭前。在整个浏览器未关闭前,其数据一直都是存在的。
javascriptvar storage = window.sessionStorage;
storage.setItem('name','testname');
storage.getItem("name");
storage.removeItem("name");
storage.clear();//清除所有数据
storage.length;//查看多少条记录
特性 | Cookie | localStorage | sessionStorage |
---|---|---|---|
数据的生命期 | 可设置失效时间,默认是关闭浏览器后失效 | 除非被清除,否则永久保存 | 仅在当前会话下有效,关闭页面或浏览器后被清除 |
存放数据大小 | 4K左右 | 一般为5MB | 一般为5MB |
与服务器端通信 | 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 | 仅在客户端(即浏览器)中保存,不参与和服务器的通信 | 仅在客户端(即浏览器)中保存,不参与和服务器的通信 |
易用性 | 需要程序员自己封装,源生的Cookie接口不友好 | 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 | 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 |
Xss:恶意攻击者往Web页面里插入恶意的Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
Csrf:恶意攻击者任意地使用其他域的 Cookie 向其他域发送 POST 请求,形成 CSRF 攻击。在post请求的瞬间,cookie会被浏览器自动添加到请求头中。
假如用户正在登陆银行网页,同时登陆了攻击者的网页,并且银行网页未对csrf攻击进行防护。攻击者就可以在网页放一个表单,该表单提交src为http://www.bank.com/api/transfer,body为count=1000&to=Tom。倘若是session+cookie,用户打开网页的时候就已经转给Tom1000元了.因为form 发起的 POST 请求并不受到浏览器同源策略的限制
我们已经知道session时有状态的,一般存于服务器内存或硬盘中,当服务器采用分布式或集群时,session就会面对负载均衡问题。
从用户端来解释,就是当一个用户第一次访问被负载均衡代理到后端服务器A并登录后,服务器A上保留了用户的登录信息;当用户再次发送请求时,根据负载均衡策略可能被代理到后端不同的服务器,例如服务器B,由于这台服务器B没有用户的登录信息,所以导致用户需要重新登录。这对用户来说是不可忍受的。所以,在实施负载均衡的时候,我们必须考虑Session的问题。
参考: https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html https://www.cnblogs.com/yangliheng/p/5852494.html
本文作者:谭三皮
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!