因为一直做的都是java后端,对于这些偏前端的知识有点模糊,昨天面试的时候被问到session的工作原理,一脸懵逼,今天整理一下。
一、什么是session
session是一次浏览器和服务器交互的会话,在jsp中,作为一个内置对象存在。我的理解,就是当用户打开网页时,程序会在浏览器中开辟一段空间来存储作为session的存储,可以对一些用户信息进行保存。session就是一个会话级别的cokkie,外加服务器内存中的一组散列表。当关闭浏览器时,cookie会消失,session也就消失了,这个cookie不写在磁盘上,而是写在浏览器的缓存中。
二、session和cookie的区别
- cookie数据存放在客户的浏览器中,session数据放在服务器上
- cookie不是很安全,别人可以轻易的获取本地的cookie并获取相关信息进行欺诈
- session有时间限制,会在设置的一定时间内保存到服务器上。
- cookie有限制,单个为3k,一个站点在客户端存放的cookie不能超过3k
所以一般将登陆的用户信息保存到session上,以防被盗,如果是其他信息,可以放在cookie里面,如果考虑到服务器的性能,减轻压力,应该使用cookie
三、session的工作原理
服务器和浏览器采用的是http无状态的通讯,那么如果多客户对服务器进行访问的话,服务器怎么区分呢,那就是使用session。在session的机制中,有一个session_id,作为一个独一无二的标识,来对客户端进行区分。每次浏览器请求的时候,就会带上这个标识。这个标识由服务器生成。
简述一下工作的流程:
- 当浏览器访问服务器时,服务器根据需求设置session,并将会话的信息保存在服务器上,并将标志着session的session_id传递给浏览器。
- 浏览器会将收到的session_id保存在内存中,这个便是无过期时间的cookie,当浏览器关闭时,cookie会被清理,同理session_id也就没有了。
- 当每次浏览器访问服务器的时候,都会带上这个session_id,服务器根据这个id获取浏览器的状态返回数据。
- session有一个超时时间,当浏览器因为一些原因被关闭的时候,服务器端的session不会马上被释放,只要我们知道session_id,一样可以获取到服务器端的应用数据。一般会给服务器端的session设置一个过期时间,保证了数据的安全性。
总结:
正常的web中的C/S模式下,在两端都会保存session,两者通过一个唯一的session_id相关联。client端的session保存在cookie中,当关闭浏览器的时候,cookie清空,session也同样没有了。server端的session保存在内存中,在client端关闭后,还会存在一段时间,到达超时时间后,生命周期完成被回收。在被回收前的这个过程中,只要知道这个唯一的session_id,就可以获取到session中存储的信息。
如上图:红框内的就是session_id
应用:
大部分的web开发,session都用来保存用户的登录状态以及用户名密码等信息