【JavaWeb】7—会话控制

news/2024/11/30 1:47:20/

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆

文章目录

  • 7 会话控制
    • 7.1 数据存入会话域
      • 7.1.1 保持登陆状态
      • 7.1.2 解决方法
    • 7.2 Cookie的工作机制
      • 7.2.1 HTTP协议和会话控制
      • 7.2.2 Cookie介绍
        • 本质
        • Cookie在浏览器和服务器之间传递
        • Cookie的时效性
        • Cookie的domain和path
    • 7.3 Session的工作机制
      • 7.3.1 简介
      • 7.3.2 流程图表示
      • 7.3.3 代码验证
      • 7.3.4 时效性
        • 设置原因
        • 设置难点
        • 设置最大闲置时间
        • 代码验证
        • 强制失效

7 会话控制

7.1 数据存入会话域

7.1.1 保持登陆状态

在这里插入图片描述

保持用户登录状态,背后的底层逻辑是:服务器在接收到用户请求的时候,有办法判断这个请求来自于之前的某一个用户。所以保持登录状态,本质上是保持 『会话状态』

7.1.2 解决方法

使用HttpSession对象,将数据存入会话域就能保持会话状态。

HttpSession session = request.getSession();
session.setAttribute("user", user);

7.2 Cookie的工作机制

7.2.1 HTTP协议和会话控制

HTTP协议本身是无状态的。单靠HTTP协议本身无法判断一个请求来自于哪一个浏览器,所以也就没法识别用户的身份状态。

在这里插入图片描述

7.2.2 Cookie介绍

本质

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

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

没有Cookie的状态:

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

创建Cookie对象并返回:

// 1.创建Cookie对象
Cookie cookie = new Cookie("cookie-message", "hello-cookie");// 2.将Cookie对象添加到响应中
response.addCookie(cookie);// 3.返回响应
processTemplate("page-target", request, response);

浏览器拿到Cookie之后:

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

服务器读取Cookie信息:

// 1.通过request对象获取Cookie的数组
Cookie[] cookies = request.getCookies();// 2.遍历数组
for (Cookie cookie : cookies) {System.out.println("cookie.getName() = " + cookie.getName());System.out.println("cookie.getValue() = " + cookie.getValue());System.out.println();
}

Cookie的时效性

  • 会话级Cookie
    • 服务器端并没有明确指定Cookie的存在时间;
    • 在浏览器端,Cookie数据存在于内存中;
    • 只要浏览器还开着,Cookie数据就一直都在;
    • 浏览器关闭,内存中的Cookie数据就会被释放;
  • 持久化Cookie
    • 服务器端明确设置了Cookie的存在时间;
    • 在浏览器端,Cookie数据会被保存到硬盘上;
    • Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响;
    • 持久化Cookie到达了预设的时间会被释放;
// ※给Cookie设置过期时间
// 正数:Cookie的过期时间,以秒为单位
// 负数:表示这个Cookie是会话级的Cookie,浏览器关闭时释放
// 0:通知浏览器立即删除这个Cookie
cookie.setMaxAge(20);

Cookie的domain和path

上网时间长了,本地会保存很多Cookie。对浏览器来说,访问互联网资源时不能每次都把所有Cookie带上。浏览器会使用Cookie的domain和path属性值来和当前访问的地址进行比较,从而决定是否携带这个Cookie。

7.3 Session的工作机制

7.3.1 简介

前提:浏览器正常访问服务器

  • 服务器端没调用request.getSession()方法:什么都不会发生;
  • 服务器端调用了request.getSession()方法
    • 服务器端检查当前请求中是否携带了JSESSIONIDCookie
      • 有:根据JSESSIONID在服务器端查找对应的HttpSession对象
        • 能找到:将找到的HttpSession对象作为request.getSession()方法的返回值返回
        • 找不到:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回
      • 无:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回

7.3.2 流程图表示

在这里插入图片描述

7.3.3 代码验证

// 1.调用request对象的方法尝试获取HttpSession对象
HttpSession session = request.getSession();// 2.调用HttpSession对象的isNew()方法
boolean wetherNew = session.isNew();// 3.打印HttpSession对象是否为新对象
System.out.println("wetherNew = " + (wetherNew?"HttpSession对象是新的":"HttpSession对象是旧的"));// 4.调用HttpSession对象的getId()方法
String id = session.getId();// 5.打印JSESSIONID的值
System.out.println("JSESSIONID = " + id);

7.3.4 时效性

设置原因

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

设置难点

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

设置最大闲置时间

  • 默认值:1800秒;

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

在这里插入图片描述

代码验证

// ※测试时效性
// 获取默认的最大闲置时间
int maxInactiveIntervalSecond = session.getMaxInactiveInterval();
System.out.println("maxInactiveIntervalSecond = " + maxInactiveIntervalSecond);// 设置默认的最大闲置时间
session.setMaxInactiveInterval(15);

强制失效

session.invalidate();

http://www.ppmy.cn/news/39135.html

相关文章

python外篇(流)

文章篇幅较大,但又不可分割所以我尽量标题细化一下。 目录 流的分类 字节流 包裹流 io.TextIOWrapper io.BufferedReader io.BufferedWriter io.BufferedRandom io.BufferedRWPair 文本流 文件流 open方法 流的分类 ### 分类 根据读写操作&#xff1a…

Mybatis一级缓存和二级缓存(带测试方法)

目录 一、什么是缓存 二、Mabtis一级缓存 (1)测试一级缓存 (2)清空一级缓存 三、Mybatis二级缓存 (1)开启二级缓存 (2)测试二级缓存 一、什么是缓存 缓存是内存当中一块存储数…

linux系统编程(6)--守护进程

1.终端概念 在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),进程中,控制终端是保存在PCB中的信息,而fork会复制PCB中的信息&a…

面向对象编程(基础)3:对象的内存解析

目录 3.1 JVM内存结构划分 3.2 对象内存解析 举例: 内存解析图: 面试题:对象名中存储的是什么呢? 3.3 练习 3.1 JVM内存结构划分 HotSpot Java虚拟机的架构图如下。其中我们主要关心的是运行时数据区部分(Runtime …

使用ffmpeg生成测试视频和图片

要使用FFmpeg生成测试视频和图片,需要安装FFmpeg,并使用命令行工具执行相应的命令。 一、生成测试视频 创建一个测试视频源文件 test.mp4: ffmpeg -f lavfi -i testsrcduration5:size1280x720:rate30 test.mp4 上述命令可以生成一个时长…

Lambda表达式的使用

练习2: 定义一个接口(Flyable),里面定义一个抽象方法:void fly(String s); 定义一个测试类(FlyableDemo),在测试类中提供两个方法 一个方法是:useFlyable(Flyable f) 一个方法是主方法,在主方…

一图看懂 stat 模块:解析 stat() 结果, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 [TOC](一图看懂 stat 模块:解析 stat() 结果, 资料整理笔记(大全)) 摘要 全文介绍系统内置 stat 模块、函数、类及类的方法和属性。 它通过代码抓…

多线程之Thread常见的成员方法

String getName() 获取线程的名字 细节: 如果我们没有给线程设置名字,线程的默认名字是Thread-X(序号,从0开始) void SetName(String name) 设置线程的…