session实现原理
SpringBoot提供了一套非常简单的session机制,那么它又是怎么工作的呢? 特别是它是怎么识别用户身份的呢? session又是存在什么地方的呢?
核心工作原理
借助cookie中的 JESSIONID 来作为用户身份标识,这个数据相同的,认为是同一个用户;然后会将session在内存中存一份,有过期时间的限制,通常每次访问一次,过期时间重新刷新当浏览器不支持cookie时,借助url重写,将 sessionld 写到url的地址中,参数名=jsessionid
技术派实现
在技术派的实现中,其实和上面的思路没有什么差别,只不过是将读写cookie,使用session的具体逻辑,展示出来了而已
当前的技术派,针对前台和管理员的后台登录,设置了两套不同的玩法;前者是基于微信公众号,后者则是传统的用户名+密码;虽然登录方式不同,但底层的原理一致;
接下来再进行讲解session/cookie的具体实例时,以管理员的后台为例进行说明,整个流程如下图所示
- 浏览器登录发送账号密码,服务端查用户库,校验用户
- 服务端把用户登录状态存为 Session,生成一个 sessionId(uuid)
- 通过登录接口返回,把 sessionId set 到 cookie 上
- 此后浏览器再请求业务接口,sessionId 随 cookie 带上
- 服务端查 sessionId 校验 session
- 成功后正常做业务处理,返回结果
小结
当前技术派中的用户身份识别这套方案,与传统的cookie/session其实没有什么本质的区别,核心思路就是
- 用户登录,生成一个唯一标识sessionid
- 服务端保存这个标识与用户的映射关系
服务端将这个标识,写cookie返回给客户端客户端后续的请求,携带cookie