关于用户信息存储相关的问题
背景
先讨论Session和Cookie,我们先了解其诞生的背景,毕竟需求推动技术的!
基于以前的互联网的网络协议的请求是HTTP(无状态的网络请求协议),意味着每一个单独的请求之间是相互独立、互不相关的,服务器在处理一个请求后并不会保存任何关于客户端状态的信息。这带来的弊端就是服务端无法判断客户端发来的请求是哪个用户发起的,因此我们需要对状态保持进行额外处理,这就诞生了Cookie和Session。
Cookie
概念
Cookie(HTTP Cookie)是由服务器(服务端)发送到用户浏览器(客户端)并保存在本地计算机上的小型文本文件(可持久化)。Cookie用于存储特定网站的用户信息(状态保持),以便在用户访问同一网站时可以检索和使用这些信息。
应用场景
概念似乎晦涩难懂,以一些应用场景举例,就可能体察到Cookie的存在了
1.用户登录,存储账号密码
这个就必须是首次登录成功后,浏览器会提示用户是否要保存账号信息,这个本质就是通过Cookie进行用户信息的存储,下次就可以直接免登录操作了。
PS:免登录不是说不用通过数据库查询,而是下次登录的信息从Cookie中取出。
2.会话管理
用于检测用户是否在网站登录后进行连续操作(访问网站资源),否侧超过过期时间,则会消失,即用户就得重新校验身份。例如:哔站登录后不作任何操作,30天过需要重新登录。
3.个性化体验
这种存储个人偏好配置,采用的方案之一就有是Cookie进行的。个人偏好配置比如:暗黑模式,页面布局,语言选择等等。
作用
通过上面的介绍,Cookie的作用也应该已经呼之欲出了!这里还是总结一下~
- 服务器识别用户,保持用户在跳转页面时会话状态的一致性。
- 实现免登陆,自动进行身份验证
- 保留个性化体验
存储位置
既然Cookie是存储在本机的小型文本,那么它具体存储在哪里呢?
答:不同的浏览器和不同的操作系统,Cookie存储本机的位置都是不同的。见下图(Chatgpt如是说)
Session
Session的中文名是会话,Session和Cookie可谓是“黄金搭档”,有了Cookie就一定有Session。
概念
会话(Session)是指在用户与服务器(服务端)之间建立的一个交互周期。它允许服务器跟踪用户在一系列请求和响应之间的状态,从而实现一定程度的状态保持。意思就是我们常说的Session是存在于服务端的一个概念,用于跟踪用户的请求和响应。
问题
浏览器的Cookie里面也有session,和服务端的Session的区别是什么?
答:前者的Session又称之为会话Cookie,他是属于浏览器进程中Session,一旦关闭浏览器,会话Cookie就会被杀死,因此是不具持久化的;后者的Session是创建于服务端,他可以被持久化,可以存储多个地方,如:内存,磁盘等。
Cookie和Session的关系
我以关系图来表示,这样显得更直观。
Session的生命周期
这里就得要分类讨论了,浏览器的Session(会话Cookie)和服务端的Session的生命周期是不一样的。
会话Cookie:浏览器端的 Session 存储在用户的浏览器中,通常在用户关闭浏览器时结束。这种 Session 只在用户的当前浏览器窗口或标签页内有效。当用户关闭浏览器时,浏览器通常会清除与该 Session 相关的 Cookie 数据。
●Session:服务端的 Session 存储在服务器上,其生命周期通常由服务器的配置来控制。服务端的 Session 可以在用户的多个请求之间保持状态,而不受用户关闭浏览器的影响。
问题
1.不同用户在同一个浏览器同一个标签页发起同一个请求,sessionId相同吗?
是相同的,但这样当前的session的value会被下一个请求的session的value覆盖。(前提是session的key是相同的)
2.同一个浏览器不同的标签页发起同一个请求,sessionId相同吗?是相同的,因为依旧遵照这同一个浏览器同一个请求,其sessionId是不变的。
3.不同浏览器发起同一个请求,sessionId相同吗?是不同的,因为请求的对象都变了,sessionId肯定不同
口说无凭,我进行了实验,写了一个很简单的请求,进行了测试。
@GetMapping("/test")public void test(HttpServletRequest request, HttpServletResponse response) throws IOException {String id = request.getSession().getId();response.getWriter().write(id);}
Edge浏览器的SessionId:
Chrome的SessionId
总结:不管是否是同一个用户还是不同的标签,只要符合同一个浏览器同一个请求,那么的sessionId一定是相同的!