前言:
本人学识浅薄,自己在学习的时候面对这些繁多的名词产生的诸多的疑问,所以查询学习之后,在此总结,帮助将来的自己学习复习,也希望能帮到别人。
这边我的疑问点在于这些名词,都是什么意思,技术?概念?存储方式?包含了一下名词:
Session,Cookie,Sessionid,LocalStorage,SessionStorage
Session:
是什么?
我认为Session是一种概念,在Web开发中,session 代表了某个用户在一定时间内与服务器进行的交互。它通常包含用户的身份验证信息、活动数据等,帮助服务器“记住”用户的状态。
包含了?
- 状态管理:服务器使用会话来维护关于用户的数据,如用户的身份、浏览记录、购物车内容等。
- 存储位置:会话信息通常存储在服务器的内存、数据库或缓存中。
- 生命周期:会话的开始通常在用户登录或开始与网站交互时,而结束则在用户登出、会话超时或关闭浏览器时。以上说的是通常,实际Session的生命周期是可以自己定义的。
Session的存储位置是在服务器端产生,至于存储位置可以有很多种,例如内存(Redis)、硬盘(数据库)、缓存(在Tomcat等服务器建立时产生的存储位置)
Sessionid
session
是一个用户与应用之间的状态和交互的集合,而session ID
是标识这种状态和交互的唯一标识符。
例子:
在Tomcat中会创建一个Session,这个Session本质是一个本质上是一个 Java 对象,它通过 HttpSession
接口进行管理,存储与用户交互相关的数据,并具有生命周期管理。Session 允许 Web 应用在无状态的 HTTP 协议的基础上实现状态管理,从而为用户提供更丰富、更个性化的体验。等于是别人封装好了,一个管理和处理的合集,包括存储位置,调用方式。
每一个用户会有一个单独的Session,找到这个Session需要一个id叫做JSESSIONID,此时这个JSESSIONID就是Sessionid,前者是后者的一个特例。至于传回这个Sessionid的方式有很多种,url的参数,Cookie,或者是json数据都可以。
倘若一个简单的图书查询网站,自己定义了一个数据库当作存储位置,创建一个方法当有新的用户登录,会返回一个id,并在一个表内创建一个id,这就是Sessionid,还有用户查询的图书的记录,(假如这个网站有一个查询记录的功能,并且只在当前登录的时候可以查看),包含了返回这个图书查询记录和实时更新图书查询记录,这就属于一个Session,实现了某个用户在一定时间内与服务器进行的交互。
Cookie:
是什么?
一种位于客户端浏览器的存储对象,Cookie主要是用来在服务端读取的,它可以用来追踪用户或维护用户的状态等。每次HTTP请求时,Cookie都会被发送到服务器。
LocalStorage:
是什么?
一种位于客户端浏览器的存储对象,LocalStorage只能在客户端读取,它用来在用户的浏览器中存储大量的数据,而不影响网站的性能。LocalStorage的数据会持久保存,只有通过JavaScript或清除浏览器缓存才能清除。
SessionStorage:
SessionStorage和Session看起来像,但其实没关系,Session是一种概念,是一个用户和服务器当前交互的合集的总称,SessionStorage是HTML5新增的一个会话存储对象。
是什么?
一种位于客户端浏览器的存储对象,sessionStorage 是HTML5新增的一个会话存储对象,用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。SessionStorage和LocalStorage非常相似,它们都是在客户端存储数据,且存储空间都比Cookie大。
详细的这个三个存储的方式的对比可以看这个文章。Cookie、LocalStorage和SessionStorage:一次非常详细的对比!https://blog.csdn.net/Cat0926/article/details/135658617
用户登录状态的总结:
我们知道http是没有登录状态的保存的,所以需要各种各样的验证用户登录状态的方法,以下是之前使用过的方法。
- 最初将用户的账号密码每次都发送到服务器进行验证很麻烦,而且数据存放到客户端是可见的,并不安全。
- 进行过一次验证之后,将用户名存放到Cookie,然后每次发挥服务器根据Cookie内的用户名传回信息,但是这样,Cookie内的数据是可以随便更改的,如果更改了用户名,就可以查询后端别的数据,这是不安全的。
- 建立起Session之后,在Session内存放用户访问时的单独的信息,例如用户名,业务信息(图书查询记录,购物车),这样返回Sessionid到客户端,每次查询带上这个Sessionid,就可以在后端按照对应的信息,了解用户的权限或者认证和一些业务信息。(这样用户就没有办法通过修改Cookie内的信息来获取不是他的信息,因为他不知道别人的Sessionid是多少)
但是这样子,如果是在很多的后端服务器上都进行访问时,按之前的方法,需要给机器都同步这个Session,并不方便,所以对于多后端服务器的模式,或者是前后端分离的模式,现在大多使用jwt的方式。
- JWT(json web token),这种传输方式,可以不在服务器端存储数据就可以验证用户是否已经登录,比较适合多后端服务器的模式。但是这种方式和之前的一样,传输数据都是不安全的,只适合拿来验证是否登录,token的签名可以验证他是否被篡改。具体原理可以看这篇文章。 JWT详细教程与使用
https://blog.csdn.net/Top_L398/article/details/109361680
需要注意的是,据我目前所知,以上所有用户访问状态的验证方式,只要客户端的token或Sessionid这种已经登录成功验证信息被截取之后,在这个信息过期之前,是可以伪装成用户进行后端请求的,但是有跨域请求的限制,所以还是比较安全的,不是自己当前的ip和端口的话,别人就算获取了你的token也无法进行请求。
总结:
Session是一种概念,Sessionid是Session概念内的一个属性,并不是说一个就单独的某一个服务器产生的包括存储和交互处理的对象就是Session,只能说那是Session的一个例子,Cookie和localstorage和Sessionstorage是一种存储对象方式。有的服务器会自带Session有的是没有,比如Tomcat有,vite没有。