session是在无状态的HTTP协议下,服务端记录用户状态时用于标识具体用户的机制。是在服务器端保存的用来跟踪用户状态的数据结构,可以保存在文件、数据库或集群中
浏览器关闭之后,这次的session就会消失,下次打开就不是这个session了(其实是Session ID发生了改变)。但是服务器可能还是保存这你上次的Session ID以及session信息,只是他们是无状态的,过段时间就会删除
大多数的应用是通过cookie来跟踪session的。第一次创建session的时候,服务端会在HTTP协议中告诉客户端,需要在cookie中记录一个sessionID,以后每次请求都会把这个会话ID发送到服务器
session保存在服务端,cookie保存在客户端
cookie的安全性一般,别人可以通过分析本地cookie并进行cookie欺骗。一般重要交互信息比如权限等会放在session保存,一般的信息记录放在cookie
单个cookie保存的数据不能超过4K,很多浏览器限制同一个域名只能保存20个cookie
当访问增多时,session会较大占用服务器的性能(一般session放在内存中)。考虑到减轻服务器性能方面,应适当使用cookie。服务器会把长时间没有活跃的session从内存删除,这个时间就是超时时间,如果超过了超时时间没访问过服务器,session就自动失效了
session的运行依赖cookie(因为sessionID保存在cookie中),所以当浏览器禁用了cookie,session也会失效。(可以通过其他方式实现,比如在url中传递sessionID,即sid=xxx
)
相同点:存储大小均为5M左右,都有同源限制策略,都是在客户端保存,不参与和服务器的通信,不会随着请求发送给服务器
不同点:
localstorage存储的数据是持久化的,除非用js手动清除或者清除浏览器缓存,否则会一直存在;sessionStorage与存储数据的脚本所在的标签页的有效期是相同的,一旦标签页或窗口被关闭,那么通过sessionStorage存储的数据也会被一起删除
localstorage在同一个浏览器内,同源文档之间共享localstorage数据,可以互相读取、覆盖 sessionStorage与localstorage一样需要同一个浏览器同源文档这个条件,但是作用域还被限制在了窗口中。也就是说,只有同一浏览器、同源文档、同一窗口的同源文档才能共享sessionStorage数据
举例:
例如你在浏览器中打开了两个相同地址的页面A、B,虽然这两个页面的源完全相同,但是他们还是不能共享数据,因为他们是不同窗口中的。但是如果是一个窗口中,有两个同源的iframe元素的话,这两个iframe的 sessionStorage 是可以互通的。