web实操9——session

news/2025/1/9 1:14:09/

概念

数据保存在服务器HttpSession对象里。
在这里插入图片描述
session也是域对象,有setAttribute和getAttribute方法

快速入门

在这里插入图片描述

代码

获取session和塞入数据:
在这里插入图片描述
获取session获取数据:
在这里插入图片描述
请求存储:
在这里插入图片描述
请求获取:
在这里插入图片描述
数据正常打印:
在这里插入图片描述

结论

由于浏览器和服务器都没用关闭,所以上面相当于一次会话的两次请求。
这时候把浏览器关闭,再直接访问demo2:
输出null,说明范围确实是在一次会话的:
一次会话中才能用session来共享数据。
在这里插入图片描述

原理分析

在这里插入图片描述
竟然共享数据,那么两次请求获取的肯定是同一个session。
那服务器是怎么确保这两个session是同一个的?
在这里插入图片描述
!!!session是依赖于cookie的,cookie是通过请求头和响应头来实现的。
1)第一次获取session,没有cookie会在内存中创建一个新的session对象,并且这个session对象有一个唯一的id值
2)给浏览器做响应的时候会发送一个响应头set-cookie:值是JSSONID=上面的session的Id。
3)浏览器收到cookie头会把cookie信息存储到浏览器内部。
4)下一次再访问当前项目里的其他资源的时候会携带这个cookie头,通过请求头cookie,值:JSSONID=session的Id值。
5)服务器自动去获取这个cookie信息,然后根据cookie信息去查找内存中有没有一个id为带过来的id的session对象。
6)找到了,getSession方法就找到了并返回。

通过抓包看

第一次:
请求头没有请求信息,响应头有响应:
在这里插入图片描述
第二次:
请求头有:
在这里插入图片描述
第一次第二次两个id值是一样的。

细节一

在这里插入图片描述

期望客户端关闭后session也能相同代码

设置一个cookie:
并设置最大存活时间,比如设置成一个小时(60秒*60=1h),那么在这一个小时之内,浏览器不管是否关闭,获取的session都是同一个。
在这里插入图片描述
我们先访问一次:
在这里插入图片描述

第一次访问session对象地址值为:
在这里插入图片描述
浏览器关闭后再次访问:
地址值一样:
在这里插入图片描述

细节二

在这里插入图片描述
浏览器不关闭,浏览器访问一次后,服务器关闭,浏览器再访问一次,两次session地址值一样么:

服务器关了,内存被释放了,session对象在内存里,所以肯定会一同被销毁掉,下次我们打开服务器再创建,两次session的地址值很难一样

两次不一样有什么问题:
虽然对象不是同一个,但是要确保数据不丢失。
钝化:序列化的过程
活化:反序列化的过程
在这里插入图片描述

说明:

tomcat已经帮我们做好钝化和活化的事了,但是idea完成不了钝化和活化的操作,我们需要借用本地的tomcat。

tomcat演示

先把工作空间里的复制到tomcat下面:
在这里插入图片描述
把这个复制一份放桌面然后把里面全部的内容打一个包:
在这里插入图片描述
在这里插入图片描述
改个名字, 直接把.zip扩展名改成.war:
在这里插入图片描述
在这里插入图片描述
然后直接把这个war包复制一份放到tomcat的webapps下:
在这里插入图片描述
然后启动本地的tomcat:
先访问demo1:
在这里插入图片描述
控制台没有任何输出:
在这里插入图片描述
再访问demo2:
在这里插入图片描述
在这里插入图片描述
然后服务器正常关闭掉,看tomcat是否会把session对象序列化到硬盘上:
到work目录下:
work目录下存储的是程序运行中动态生成的数据,包括jsp转换的java文件,session被序列化后的文件。

现在什么都没有:
在这里插入图片描述
然后服务器正常关闭:
在这里插入图片描述
这边自动生成一个:
这里面放的就是session对象。
在这里插入图片描述
然后再服务器启动:
这里自动消失了,他把对象又自动还原到内存中了。
在这里插入图片描述
虽然这时候地址值不一样,但是里面内容sessionid值都是一样的。
访问demo2:
依然可以拿到里面的数据:
在这里插入图片描述

说明

idea只能钝化不能活化,没关系,因为将来部署项目不会在idea本地部署,都是在tomcat服务器里。

细节三——session的失效时间

在这里插入图片描述

解释说明

2)httpSession中session自杀的方法:
一调用session就自己杀掉了自己。
在这里插入图片描述
3)比如打开一个网站,登陆了,登录30分钟之内没做任何操作,这时候session会失效,会提示你重新登录。session如果30分钟内不活动就会被服务器自动删除掉。
但是可以在tomcat里选择性配置的:
web.xml是所有项目的父配置文件:
在这里插入图片描述
打开,搜一下session的配置:
可以修改想要的时间。
在这里插入图片描述

session的特点

在这里插入图片描述
1)存的值是object,所以可以存任何类型。而且session没有大小的限制,想存多大存多大,只要你内存放得下。
在这里插入图片描述
2)重定向是一次会话中两次请求,两次请求之间我们要共享数据,可以使用session也可以使用applicationContext,但是使用context范围太大了,所以session是我们经常采用的共享一次会话的数据。
3)session一般存的数据比较大,session翻译过来是主菜的意思,cookie是小饼干,所以从他们体量来说session也比较大一点。

案例——验证码


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

相关文章

【FlutterDart】 拖动改变 widget 的窗口尺寸大小GestureDetector~简单实现(10 /100)

上效果 预期的是通过拖动一条边界线改变窗口大小,类似vscode里拖动效果。这个是简单的拖动实现 上代码: import package:flutter/material.dart;class MyDraggableViewDemo extends StatelessWidget {const MyDraggableViewDemo({super.key});override…

【Unity3D】遮挡剔除 Occlusion

目录 一、实现方法 二、为什么遮挡剔除无效,仅有视椎体剔除生效? 三、关于Occlusion Area组件的影响 四、动态遮挡物体 Occlusion Portal 参考文档:遮挡剔除 - Unity 手册 一、实现方法 版本:Unity 2021.2.7f1c1 位于射线前…

贝叶斯算法详解:用概率思维解决分类难题

贝叶斯算法(Bayesian Algorithm)简介 贝叶斯算法是基于贝叶斯定理的一类机器学习方法,主要用于分类问题。它通过计算某个样本属于不同类别的概率,选取最大概率对应的类别作为预测结果。贝叶斯算法简单、高效,尤其在处…

ChatGPT最新版本“o3”的概要

o3简介 o3于2024年12月20日发布——也就是OpenAI 12天直播的最后一天。目前处于安全性测试阶段。它是o1的继任者,旨在处理更复杂的推理任务。o3特别针对数学、科学和编程等领域进行了优化。 o3在多项基准测试中表现出色。例如,在ARC-AGI基准测试中&…

C++ 日志库 spdlog 使用教程

Spdlog是一个快速、异步、线程安全的C日志库,他可以方便地记录应用程序的运行状态,并提供多种输出格式。官网:https://github.com/gabime/spdlog 安装教程可以参考:https://blog.csdn.net/Harrytsz/article/details/144887297 S…

自动化删除work32挖矿脚本

work32 是一个挖矿病毒,会进入到linux服务器中挖矿,导致你的服务器很卡,删了又有,根本停不掉,那我们自动化删 #!/bin/bash# 目标进程关键词 PROCESS_NAME"work32"while true; do# 检查是否存在目标进程pid$…

MySQL数据表设计 系统权限表设计 权限、角色、用户表设计

数据库 创建 CREATE DATABASE my_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 修改 ALTER DATABASE my_database CHARACTER SETutf8mb4 COLLATEutf8mb4_unicode_ci; 字符集:utf8和utf8mb4,推荐使用:utf8mb4 utf8&…

ceph文件系统

ceph文件系统 ceph基础知识ceph系统的核心原理和组件1. 架构和组件1.1 Ceph Monitor (MON)1.2 Ceph OSD (Object Storage Daemon)1.3 Ceph MDS (Metadata Server)1.4 Ceph Client 2. 数据存储与分布2.1 CRUSH 算法2.2 数据副本与容错 3. 数据一致性4. pg和存储池与osd之间的关系…