当前位置:网站首页>Cookie和Session以及其相关问题

Cookie和Session以及其相关问题

2022-09-23 08:30:10今天也是敲代码的一天哦

Cookie

Cookie的由来及定义

为了安全,默认情况下,浏览器是不会让js代码访问到用户电脑的文件系统的。

假如某个网页包含恶意代码,你又不小心点击了,触发了这些恶意代码,那么这些恶意代码就有可能删掉你文件系统中的重要文件。这是浏览器不允许的。

但是这样的安全机制,也会造成一些麻烦,比如有些时候确实需要存储一些数据方便后面网站的访问。

其中最为典型的就是存储用户当前的身份信息:
当用户在登录页完成身份验证后,服务器就会给浏览器返回用户的身份信息,浏览器需要存储这个信息。在后续访问同一个网站时,浏览器再自动带上这个身份信息,服务器就可以识别了。

虽然不能让js代码访问整个磁盘,但是为了存储这部分数据也不是不能开一点后门,那就是单独给浏览器分配一个“小黑屋”,让js代码可以访问这个小黑屋,但不会影响到磁盘其他数据。而Cookie就是这个开后门机制中的一种。
所以,Cookie就是浏览器给网页提供的一种存储数据的机制

Cookie的组织形式

1.先按照域名域名来组织,给每个域名分配一个“小黑屋”,下图就是给B站分配的“小黑屋”
在这里插入图片描述
2.在“小黑屋”里面又会按照键值对的方式存储数据,点击一下上面的一个Cookie就可以看见这些键值对了,如下图:
在这里插入图片描述

Cookie的数据从哪来

这个数据可能是客户端(网页)自行通过 JS 写入的,也可能是服务器返回给客户端的.比如当服务器完成身份校验后,会在响应报文中的header中以Set-Cookie的键值对的形式返回一些数据,如下图就是gitee登录后返回的报文信息(为啥不继续用B站…B站登录太麻烦了…
在这里插入图片描述
返回的Set-Cookie里面有一个gitee-session-n:这个就非常重要了,大概率这个就是服务器端创建的Session会话的SessionId(会话标识),之后就是靠这个用户对应的会话,进一步获取用户的详情信息。

之后当你去访问这个网站其他页面的时候,请求中就会带有Cookie中的信息
在这里插入图片描述
同样也有非常重要的gitee-session-n。

Cookie的整个过程

其实就相当于你去医院挂号,你交给挂号处一些钱和个人基本信息,挂号处会给你一张就诊卡,这个卡就是cookie。
之后你去科室,只需要刷一下卡就知道你的个人基本信息和过往病例…
去检测,只需要刷一下就知道你需要做什么检测…
去取药,也只需要刷一些卡就知道你需要取什么药…

获取上述信息就是因为有这个卡(Cookie),但其实个人信息并不是存在这个卡上面的,它只存了一个标识(比如SessionId),因为“小黑屋”空间很有限,并不能存很多东西,而且也特别容易丢(你的就诊卡是不是经常丢~~)。这些信息其实是存在医院的服务器上的,服务器又用什么机制来存储这些信息呐,那就是下面要说的Session机制。

Session

上面已经说了Session的部分来由了,那么就一句话概括一些Session是干什么的:
Session是服务器存储关键信息的一种机制

创建Session

使用HttpServletRequest类中的getSession()方法创建Session(当这个方法为true时,没有session才会创建session,为false没有session直接返回null),
1.首先获取请求中Cookie里面的sessionId字段
2.判断这个sessionId是否存在于当前服务器
3.如果不存在,就创建一个会话,会创建一个HttpSession对象,然后生成一个能确保唯一性的SessionId(通常为16进制),接下来把这个sessionId作为key,将HttpSession对象作为value,存到服务器中类似哈希表的结构中。
4.给客户端返回一个响应,这个sessionId通过Set-Cookie字段传给客户端,然后客户端就将这个字段保存到Cookie中。

获得Session

同样也是
1.首先获取请求中Cookie里面的sessionId字段
2.判断这个sessionId是否存在于当前服务器
3.通过sessionId在服务器上取出HttpSession对象

Cookie和Session的相关问题

Session机制的原理

当客户端访问服务器时,如果没有对应的会话,会创建一个HttpSession对象来存储一些信息和生成一个sessionId,并将两者以键值对的方式存在服务器中类似哈希表的结构中。同时将sessionId返回给客户端,客户端之后可以通过这个sessionId来获取服务器中存在对应HttpSession中的数据。

Cookie和Session的区别

Session是服务器端保存数据的机制,Cookie是客户端保存数据的机制

Cookie保存在客户端本地,客户端请求服务器时会将Cookie一起提交;Session保存在服务端,通过检索Sessionid查看HttpSession对象。保存Sessionid的方式可以采用Cookie,如果禁用了Cookie,可以使用URL重写机制(把会话ID保存在URL中,通过response.encodeURL()完成)。

Session和Cookie先有谁?

先有Cookie再有Session,因为绝大多数情况下Session的sessionId是要存在Cookie中的。

原网站

版权声明
本文为[今天也是敲代码的一天哦]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_54575205/article/details/126994178

随机推荐