深入理解Session和Cookie关系

他俩的来源

废话不多说,上货,验货,点赞,散会(好久没写博客了)!
在这里插入图片描述

追根溯源

生命不息,学习不止,总能发现新玩意。这不今天改bug发现了个有意思的现象,场景是这样的:
网页展示了数据列表,随后设定了查询条件,列表更改,这时点击导出,导出的数据居然是全数据,查询条件失效了,后端导出时查询列表也调用了展示列表的方法,按道理应该也是具有查询条件的,为何失效了呢。
后来发现了问题所在,我的导出使用了脚本,所以无法获取session,所以需要我手动从session获取查询参数然后替换,这时我就有个问题了,session既然是储存在服务器的,客户端从session中拿数据的时候是如何确定是那个session呢
记住这个问题,下面要考!!!
所以就引出了这篇博客。
在这里插入图片描述

解析 Session和Cookie

解析他俩之前我们要先明白一个定义,会话(HTTP会话)———在计算机术语中,会话是指一个终端用户与交互系统进行通讯的过程(是不是很有文化,其实摘自百度百科)举一个例子就是服务端和客户端产生了一次数据交互。
Session在网编中被称为会话控制,这样是不是对Session有了一个初步的认知,在我的理解中,因为HTTP协议是一种无状态协议,所以当我们切换页面或者关闭页面时,客户端无法为我们保存状态(相关会话的数据)所以为了弥补这一缺点,有了Session对象,Session对象中存储了会话所需要的属性及配置信息
有Session就离不开Cookie。
Cookie其实是一个小型的文本数据文件,存储在用户的本地终端上,记录了终端访问web的相关信息当终端再次访问cookie中有相关记录的web时,相关信息就会提供给web使用

大白话转换

上面的说法太过官方话,现转译成大白话
HTTP是一种无状态协议,所以当我们切换网页或者重新打开网页,网页无法确定使用者是谁,所以无法保留之前的行为信息,为了弥补这个缺点,HTTP给每次会话发了一个身份通行证——cookie,从而鉴别使用者,加载使用者之前的行为记录,这些行为记录由cookie存储在用户终端本地上。(是不是一下子清晰了)
在这里插入图片描述

Cookie详解

1.Cookie的储存位置:一般是C盘中用户目录相关浏览器User Data文件中
2.Cookie的生命周期:Cookie中的maxAge属性决定着Cookie的有效期,一般都是按秒算
  maxAge属性分为正负,正数表示的持久化的Cookie,无论关闭网页还是终端
  只要还在maxAge的时间内;再次登录网页,Cookie都是生效的
  如果是负数则代表是临时性Cookie;只要关闭网页,Cookie就失效了
  Cookie没有删除机制,所以当maxAge为0时,Cookie就会失效,
  失效的Cookie会被浏览器从Cookie文件或者内存中删除
3.如何创建一个CookieCookie cookie = new Cookie("time","20210909");    // 新建Cookie
  cookie.setDomain(".我嫩爹.com");                   // 设置域名
  cookie.setPath("/");                              // 设置路径
  cookie.setMaxAge(Integer.MAX_VALUE);              // 设置有效期
  response.addCookie(cookie);                       // 输出到客户端
4.Cookie的实现原理:
  Cookie文件中定义了"HTTP请求头和HTTP响应头",通过这些HTTP头信息使服务器可以与客户端进行状态交互
  客户端请求服务器后,如果服务器需要记录用户状态,"服务器会在响应信息中包含一个Set-Cookie的响应头",
  客户端会"根据这个响应头存储Cookie信息",再次请求服务器时,"客户端会在请求信息中包含一个Cookie请求头"
  而服务器会根据这个请求头进行用户身份、状态等较验。

Session详解

1.Session的储存位置:"服务器内存中",例如 tomcat的StandardManager类将session存储在内存中
2.Session的生命周期:为了提高相应速度,服务器储存Session时会给每个用户的单独划分一块区域
  Session在用户访问服务器时自动闯将,访问静态资源,例如Html,css不会产生Session
  Session的超时时间为maxInactiveInterval,用户每次重复访问服务器就会刷新maxInactiveInterval
  超时后Session就会失效,服务器会把长时间内没有活跃的Session从内存删除,
  开发时可手动调用invalidate()方法使Session失效
3.Session的创建:
  HttpSession session = request.getSession();      // 获取Session对象
  session.setAttribute("loginTime", new Date());   // 设置Session中的属性,键值对方式
  out.println("时间为:" +(Date)session.getAttribute("loginTime")); // 获取Session属性

回归问题

回头再看我们一开始提出的问题,session既然是储存在服务器的,客户端从session中拿数据的时候是如何确定是那个session呢
这就涉及到了Session的工作原理,Session其实依赖于Cookie工作的,SessionID是第一次新会话时产生的,产生时创建一个新的SessionID对象,服务器创建一个Cookie对象存储SessionID,并发送给客户端,Cookie存储与本地中,浏览器即可根据SessionID访问服务器中对应的Session对象,服务器则根据SessionID从内存中获取到对应的Session对象。
在这里插入图片描述

每次浏览器想访问session时就会去cookie中查看是否有该SessionID,没有就证明产生了一个新的会话。

最后给你们推荐一本书吧

在这里插入图片描述

如果有错误或者需要补充请写在下面,跟我打一架!
在这里插入图片描述
古德拜~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值