cookie和session都是用来跟踪浏览器用户身份的会话方式。
一、cookie
- 定义:简单来说,cookie其实是个存储在浏览器中的文本文件,是服务器保存在客户端的数据。它是HTTP协议的规范之一,主要内容包括:名字、值、过期时间、路径和域。(详解可参考百度百科或维基百科,看起来好复杂...)
- cookie规范:服务器通过响应头把cookie传给客户端,客户端将其保存起来;客户端再次请求同一服务器时,该cookie将添加在请求头中发送给服务器。规定一个服务器在一个客户端最多保存20个cookie,一个浏览器最多保存300个cookie,一个cookie最大为4KB。
- cookie机制:如果不在浏览器中设置过期时间,cookie的生命周期将一直到浏览器关闭时结束,此前将保存在内存中。如果设置了过期时间,即使关闭了浏览器,cookie也将一直存在直到设置时间时结束,此前将保存在硬盘中。
- 保存位置:cookie保存在浏览器端
- 存储内容:只能存储字符串类型
- 存储大小:单个cookie保存的数据大小不超过4KB
- 安全性:不安全,存在cookie欺骗和cookie截获
- 应用场景:实现登录时自动登录或记录上次登录信息、保存上次查看的页面
- 缺点:大小受限、功能受限(可以禁用)、安全性低、每次访问都需要传送cookie给服务器、可以限制cookie只属于某个路径下
- cookie支持跨域名访问,是同源的
- 使用操作:
* 获取:request.cookies.get(key, " ")
* 设置:resp.set_cookie(key, value, max_age = 整数)
* 删除:resp.delete_cookie(key)
二、session
- 定义:服务器为浏览器创建的一个对象。
- session原理:当用户第一次请求服务器时,服务器会同时创建一个session和一个cookie,并在cookie中保存sessionid发送给客户端。当用户再次请求服务器时,会将sessionid加在请求头中发送给服务器,服务器通过该sessionid查找session对象。当浏览器关闭后再打开重新访问或长时间未操作页面时,会重新创建一个session会话
- session机制:当服务器收到请求需要创建session对象时,首先检查客户端请求中是否包含sessionid,如果有,将根据该id返回一个session对象,如果无,则创建一个新的session对象并返回sessionid给客户端。而sessionid一般是通过cookie方式存储到客户端的。如果客户端禁用cookie,则使用response.encodeURL(url)重写URL。
- 保存位置:session保存在服务器端
- 存储内容:支持对象类型
- 存储大小:无限制
- 安全性:比cookie安全。原因主要有如下几点:sessionid存储在cookie中,要得到sessionid必须先攻破cookie;sessionid只会在登录或启动session_start时才会出现;第二次启动session_start后,前一次的sessionid失效,session过期后,sessionid也随之失效;sessionid是加密的。
- 应用:将某些数据放入session中以便同一用户在不同页面中使用、保存用户的登录信息
- 缺点:占用服务器内存、依赖于cookie、过度使用会使代码难以维护、同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到
- session只支持仅在它所在的域名内有效
- 使用操作:
* 获取:session.get(key, "默认值")
* 设置:session.permanent = True 、 session[key] = value
* 删除:session.pop(key,None)、session.clear()
三、webStorage:localStorage和sessionStorage(HTML5离线缓存)
webStorage的基本特点如下:
1.可以存储大小为5MB的数据
2.存储内容为字符串类型
3.存储在浏览器端,不与服务器进行交互
4.使用window.localStorage和window.sessionStorage来获取
5.不同浏览器无法共享localStorage或sessionStorage中的信息。相同浏览器的不同页面间可以共享相同的 localStorage(页面属于相同域名和端口),但是不同页面或标签页间无法共享sessionStorage的信息。这里需要注意的是,页面及标签页仅指顶级窗口,如果一个标签页包含多个iframe标签且他们属于同源页面,那么他们之间是可以共享sessionStorage的。
6.具备的方法有:
保存数据:setItem(key, value)
获取数据:getItem(key)
删除单个数据:removeItem(key)
删除所有数据:clear()
获取index对应的key:key(index)
而这两种HTML5离线存储的方式又有所不同:
- 生命周期不同:前者始终存在,除非手动清除;后者仅在当前浏览器窗口关闭前有效。
- 作用域不同:前者在所有同源窗口中共享;后者不在不同的浏览器窗口中共享,即使是同一个页面。
- 应用场景不同
sessionStorage是在同源的窗口中始终存在的数据。只要这个浏览器窗口没有关闭,即使刷新页面或者进入同源另一个页面,数据依然存在。但是sessionStorage在关闭了浏览器窗口后就会被销毁。同时独立的打开同一个窗口同一个页面,sessionStorage也是不一样的。
webStorage的好处有:减少了不必要的数据请求、可以快速显示页面、临时存储、提供了可以大量存储的跨会话的数据存储机制、数据使用操作优于cookie
四、离线存储
1、什么是离线存储?
用户未与网络连接时,可正常访问站点或应用;用户与网络连接时,更新用户机器上的缓存文件。
2、离线存储的原理?
离线存储是基于一个新建的Appcache文件的缓存机制。通过这个文件上的清单解析离线存储资源,这些资源会像cookie一样被存储下来。当网络离线时,浏览器直接使用被离线存储的数据。
3、如何使用离线存储?
在线时,浏览器发现html头部有mainfest属性,会请求mainfest文件。如果是第一次访问App,则浏览器根据mainfest文件的内容下载相应的资源并进行离线存储;如果已访问过App且资源已离线存储,则浏览器会使用离线存储的资源加载页面并对比新旧mainfest文件。如果文件未发生改变,就不再进行操作;如果文件改变了,就重新下载文件资源并离线存储。离线时,浏览器直接使用离线存储的资源。