无状态
无状态是HTTP协议的特点,对事务的处理能力没有记忆能力,不能对之前的信息进行存储
HTTP状态保持
cookie:
cookie是存储在客户端的一小段文本,用来存储当前的一些信息和服务器保持交流
原理:当一个客户端游览器连接到一个URL,它会首先扫描本地存储的Cookie,如果发现其中有与此URL相关的Cookie,就会把它们返回给服务器端. cookie也是客户端同服务端建立连接后,由服务端发送给客户端,客户端每一次发送请求,都会把cookie携带,一并发送给服务器
作用:实现客户端和服务器端之间的状态保持,存储客户信息.
cookie的缺陷:
- Cookie会被附加在每个HTTP请求中,所以无形中增加了流量
- 由于在HTTP请求中的Cookie是明文传递的,所以不安全,还可以被伪造,不要存敏感值,除非用HTTPS
- Cookie是通过键值对方式,只能字符串传,大小限制在4KB左右,对于复杂的存储需求来说是不够用的
- Cookie数据在客户端本地存储
- 默认每一次关闭页面,cookie都会失效,可以指定过期时间. //expires属性可以设置过期时间,UTC格式
Session:
- 数据存在服务器端,不好获取和修改,比较安全
- session文件没有大小限制
- session存储的数据类型除了资源外的数据类型都可以
- 服务端向客户端发送一个cookie,cookie用来保存sessionID
- 服务器将session数据保存在服务器上,而将session的用户id存储在客户端上
- 客户端通过向服务端发送cookie,服务端解析出sessionID, 用来匹配客户端的私有数据
session和cookie的区别
- session 保存在服务器,客户端不知道其中的信息;cookie 保存在客户端,服务器能够知道其中的信息
- session 中保存的是对象,cookie 中保存的是字符串
- session 不能区分路径,同一个用户在访问一个网站期间,所有的session在任何地方都可以访问到。而 cookie 中如果设置了路径参数,那么同一个网站不同路径下的 cookie 互相是不可以访问的
- cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行cookie欺骗
- session 会在一定时间内保存在服务器上。当访问增多,会占用你服务器的性能。考虑到减轻服务器性能方面,应该使用 COOKIE
- 单个 cookie 保存的数据不能超过 4k ,很多浏览器都限制一个站点最多保存 20 个 cookie
- session 是通过 cookie来工作的
cookie, session, token特点
1.为什么会出现这种技术: 因为http协议是无状态的,它无法让服务器识别到底是谁在发送请求
1.cookie 第一代技术 不需要前端操作
-
存储在客户端
-
容量小4kb, 不安全
-
客户端首次同服务器通讯时,是没有cookie的,是从服务端发送过来
-
cookie可以设置有效时间
-
客户端在和服务端通讯时,客户端会自动在请求头中把cookie发送给服务端
-
session 第二代技术 不需要前端操作
-
存储在服务端
-
它存储大小就是服务器的容量大小
-
它会生成一个seesionID放进cookie里发送到客户端,然后客户端会把含有sessionID的cookie在通讯时发送给服务端
-
如果用户太多的话,服务端容量会造成泄漏
3.token 第三代技术
- 它是随着每一次通讯在客户端和服务端来回发送
- 它是一段加密后的无序字符串,保存的是用户的信息包括过期时间吗,服务端需要解密后才能拿到客户信息
- 发送token可以有两种方式
①跟随cookie走, 不需要前端操作
②服务器如果把token放在响应体里,那么就需要我们前端去主动存储,我们一般存储在localStorage里或者sessionStorage里, 需要前端操作
③如果是前端去操作token,我们需要每一次发送请求时候,手动把token放在请求头里发送给服务端
内容 | cookie | localStorage | sessionStorage |
---|---|---|---|
生命周期 | 一般由服务器生成,可设置失效的时间,如果在浏览器端生成cookie,默认关闭浏览器后失效 | 除非被删除,否则永久保存 | 仅在当前会话下有效,关闭页面或者浏览器后被删除 |
数据大小 | 4k | 20M | 5M |
与服务器端通信 | 携带在http请求头中,若保存cookie过多数据会带来性能问题 | 仅在客户端即浏览器中保存,不参与和服务器的通信 | 仅在客户端即浏览器中保存,不参与和服务器的通信 |
易用性 | 需要程序员自己封装 | 原生接口可以接受,亦可以再次封装来对obj和Arr有更好的支持 | 原生接口可以接受,亦可以再次封装来对obj和Arr有更好的支持 |