Servlet 会话

HTT协议本身P是无状态的,服务器无法区分两次请求是否是同一个客户端发送过来的。所以两个用户操作时,便会产生数据错误。因此通过会话跟踪技术来解决这个问题。

图片[1]-Servlet 会话-深吸氧

1. Cookie

1.1 本质

  • 在浏览器端临时存储数据
  • 键值对
  • 键和值都是字符串类型
  • 数据量很小

1.2 Cookie在浏览器和服务器之间的传递

1.2.1 没有Cookie的状态

在服务器端没有创建Cookie并返回的情况下,浏览器端不会保存Cookie信息。双方在请求和响应的过程中也不会携带Cookie的数据。

1.2.2 创建Cookie对象并返回

图片[2]-Servlet 会话-深吸氧

1.2.3 浏览器拿到Cookie之后

浏览器拿到Cookie之后,以后的每一个请求都会携带Cookie信息。

图片[3]-Servlet 会话-深吸氧

1.2.4 服务器端读取Cookie的信息

图片[4]-Servlet 会话-深吸氧

1.3 Cookie时效性

  • 会话级Cookie
    • 服务器端并没有明确指定Cookie的存在时间
    • 在浏览器端,Cookie数据存在于内存中
    • 只要浏览器还开着,Cookie数据就一直都在
    • 浏览器关闭,内存中的Cookie数据就会被释放
  • 持久化Cookie
    • 服务器端明确设置了Cookie的存在时间
    • 在浏览器端,Cookie数据会被保存到硬盘上
    • Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
    • 持久化Cookie到达了预设的时间会被释放

2. Session

Session是用来维护客户端与服务器端关联的一种技术,每个客户端都有自己的一个Session会话,Session会话会话中经常用来保存用户登录后的信息。

2.1 流程

  • 服务器端没调用request.getSession()方法:什么都不会发生
  • 服务器端调用了request.getSession()方法
    • 服务器端检查当前请求中是否携带了sessionId的Cookie
      • 有:根据sessionId在服务器端查找对应的HttpSession对象
        • 能找到:将找到的HttpSession对象作为request.getSession()方法的返回值返回
        • 找不到:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
      • 无:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
图片[5]-Servlet 会话-深吸氧

2.2 代码

图片[6]-Servlet 会话-深吸氧

2.3 时效性

2.3.1 为什么Session要设置时限

用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。

2.3.2 设置时限的难点

从服务器端的角度,很难精确得知类似浏览器关闭的动作。而且即使浏览器一直没有关闭,也不代表用户仍然在使用。

2.3.3 服务器端给Session对象设置最大闲置时间

默认值:1800秒

图片[7]-Servlet 会话-深吸氧

最大闲置时间生效的机制如下:

图片[8]-Servlet 会话-深吸氧

2.3.4 代码

图片[9]-Servlet 会话-深吸氧

2.3.5 强制Session立即失效

session.invalidate();

© 版权声明
THE END
请撒泡尿证明你到此一游
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容