当前位置: 首页 > news >正文

Session使用和原理分析图与实现原理-- 代码演示说明 Session 的生命周期和读取的机制代码分析

目录

Web 开发会话技术 -Session

—session 技术

session 基本原理

Session 可以做什么

如何理解 Session

Session 的基本使用

session 底层实现机制

原理分析图

代码演示

CreateSession.java

测试 Session 创的机制, 注意抓包分析​编辑

ReadSession.java 

测试 Session 读取的机制, 注意抓包分析

Session 实现原理

 ​编辑

session 生命周期

Session 生命周期-说明

 代码演示说明 Session 的生命周期

CreateSession2

ReadSession2

Session 的生命周期

代码示例

DeleteSession

代码示例

需求

login.html

LoginCheckServlet

ManageServlet

error.html


Web 开发会话技术 -Session

—session 技术

  1. Session 是服务器端技术,服务器在运行时为每一个用户的浏览器创建一个其独享的 session 对象/
  2. 由于 session 为各个用户浏览器独享,所以用户在访问服务器的不同页面时,可以从各自 的 session 中读取/添加数据, 从而完成相应任务

session 基本原理

1. 当用户打开浏览器,访问某个网站, 操作 session 时,服务器就会在内存(在服务端)为该

浏览器分配一个 session 对象,该 session 对象被这个浏览器独占, 如图

2. 这个 session 对象也可看做是一个容器/集合,session 对象默认存在时间为 30min(这是在tomcat/conf/web.xml),也可修改

Session 可以做什么

1. 网上商城中的购物车

2. 保存登录用户的信息

3. 将数据放入到 Session 中,供用户在访问不同页面时,实现跨页面访问数据

4. 防止用户非法登录到某个页面

5. .....

如何理解 Session

1. session 存储结构示意图

2. 你可以把 session 看作是一容器类似 HashMap,有两列(K-V),每一行就是 session 的一个属性。

3. 每个属性包含有两个部分,一个是该属性的名字(String),另外一个是它的值(Object)

Session 的基本使用

1. 创建和获取 Session,API 一样

HttpSession hs=request.getSession();

第 1 次调用是创建 Session 会话, 之后调用是获取创建好的 Session 对象

2. 向 session 添加属性

hs.setAttribute(String name,Object val);

3. 从 session 得到某个属性

Object obj=hs.getAttribute(String name)

4. 从 session 删除调某个属性:

hs.removeAttribute(String name);

5. isNew(); 判断是不是刚创建出来的 Session

6. 每个 Session 都有 1 个唯一标识 Id 值。通过 getId() 得到 Sessio

session 底层实现机制

原理分析图


 

代码演示

CreateSession.java

public class CreateSession extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//System.out.println("CreateSession 被调用...");//1. 获取session, 同时也可能创建sessionHttpSession session = request.getSession();//2. 给session获取idSystem.out.println("CreateSession 当前sessionid= " + session.getId());//3. 给session存放数据session.setAttribute("email", "zs@qq.com");//4. 给浏览器发送一个回复response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>创建/操作session成功...</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

测试 Session 创的机制, 注意抓包分析

ReadSession.java 

public class ReadSession extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//System.out.println("ReadSession 被调用...");// 演示读取session//1. 获取session, 如果没有sesion, 也会创建HttpSession session = request.getSession();//输出sessionIdSystem.out.println("ReadSession sessionid= " + session.getId());//2. 读取属性Object email = session.getAttribute("email");if (email != null) {System.out.println("session属性 email= " + (String) email);} else {System.out.println("session中没有 email属性 ");}//给浏览器回复一下response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>读取session成功...</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

测试 Session 读取的机制, 注意抓包分析

Session 实现原理

 

session 生命周期

Session 生命周期-说明

1. public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。

2. 值为正数的时候,设定 Session 的超时时长。

3. 负数表示永不超时

4. public int getMaxInactiveInterval()获取 Session 的超时时间

5. public void invalidate() 让当前 Session 会话立即无效

6. 如果没有调用 setMaxInactiveInterval() 来指定 Session 的生命时长,Tomcat 会以 Session默认时长为准,Session 默认的超时为 30 分钟, 可以在 tomcat 的 web.xml 设置

7. Session 的生命周期指的是 :客户端/浏览器两次请求最大间隔时长,而不是累积时长。即当客户端访问了自己的 session,session 的生命周期将从 0 开始重新计算。(解读: 指的是同一个会话两次请求之间的间隔时间)

8. 底层: Tomcat 用一个线程来轮询会话状态,如果某个会话的空闲时间超过设定的最大值,则将该会话销毁

 代码演示说明 Session 的生命周期

CreateSession2

public class CreateSession2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("CreateSession2 被调用");//创建sessionHttpSession session = request.getSession();System.out.println("CreateSession2 sid= " + session.getId());//设置生命周期为 60ssession.setMaxInactiveInterval(60);session.setAttribute("u", "jack");//回复一下浏览器response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>创建session成功, 设置生命周期60s</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

ReadSession2

public class ReadSession2 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//System.out.println("ReadSession2 被调用...");//1. 获取到sessionHttpSession session = request.getSession();System.out.println("ReadSession2 sid= " + session.getId());//2. 读取session的属性Object u = session.getAttribute("u");if (u != null) {System.out.println("读取到session属性 u= " + (String) u);} else {System.out.println("读取不到session属性 u 说明原来的session被销毁");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

Session 的生命周期

1) 指的是两次访问 session 的最大间隔时间
2) 如果你在 session 没有过期的情况下,操作 session, 则会重新开始计算生命周期
3) session 是否过期,是由服务器来维护和管理
4) 如我们调用了 invaliate() 会直接将该 session 删除/销毁
5) 如果希望删除 session 对象的某个属性, 使用 removeAttribu

代码示例

DeleteSession

public class DeleteSession extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("DeleteSession 被调用...");//演示如何删除sessionHttpSession session = request.getSession();session.invalidate();// 如果你要删除session的某个属性//session.removeAttribute("xxx");//回复一下浏览器response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>删除session成功</h1>");writer.flush();writer.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

代码示例

需求

只要密码为 666666, 我们认为就是登录成功
2) 用户名不限制
2. 如果验证成功,则进入管理页面 ManageServelt.java ,否则进入 error.html
3. 如果用户直接访问 ManageServet.java , 重定

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页面</title>
</head>
<body>
<h1>用户登录界面</h1>
<form action="/cs/loginCheck" method="post">u:<input type="text" name="username"><br/>p:<input type="password" name="pwd"><br/><input type="submit" value="登录">
</form>
</body>
</html>

LoginCheckServlet

public class LoginCheckServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("LoginCheckServlet 被调用..");//功能-> 自己拆解 -> 逐步实现//1. 得到提交的用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");if("666666".equals(password)) {//认为合法//把用户名保存到 sessionHttpSession session = request.getSession();session.setAttribute("loginuser", username);//请求转发到ManageServletrequest.getRequestDispatcher("/manage").forward(request, response);} else {//请求转发进入到 error.htmlrequest.getRequestDispatcher("/error.html").forward(request, response);}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

ManageServlet

public class ManageServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//判断该用户是否登录过HttpSession session = request.getSession();Object loginuser = session.getAttribute("loginuser");if(loginuser == null) {//说明该用户没有登录//重新登录-> 请求重定向//response.sendRedirect("/cs/userlogin.html");response.sendRedirect(request.getContextPath() + "/userlogin.html");return;} else {response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.println("<h1>用户管理页面</h1>");writer.println("欢迎你, 管理员:" + loginuser.toString());writer.flush();writer.close();}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

error.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录失败</title>
</head>
<body>
<h1>登录失败</h1>
<!--
web工程路径专题
1. a 标签是 浏览器解析
2. 第一 / 被解析成 http://localhost:8080/
3. 如果没有 / 会以当前浏览器地址栏 的 http://localhost:8080/工程路径../资源 去掉资源部分作为参考路径
-->
<a href="/cs/userlogin.html">点击重新登录</a>
</body>
</html>

相关文章:

Session使用和原理分析图与实现原理-- 代码演示说明 Session 的生命周期和读取的机制代码分析

目录 Web 开发会话技术 -Session —session 技术 session 基本原理 Session 可以做什么 如何理解 Session Session 的基本使用 session 底层实现机制 原理分析图 代码演示 CreateSession.java 测试 Session 创的机制&#xff0c; 注意抓包分析​编辑 ReadSession.j…...

在win10系统中安装anaconda

1、 Anaconda的下载 你可以根据你的操作系统是32位还是64位选择对应的版本到官网下载&#xff0c;但是官网下载龟速。 建议到清华大学镜像站下载 &#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source MirrorIndex of /anaconda/archiv…...

【菜鸡读论文】Cross-domain Named Entity Recognition via Graph Matching

【菜鸡读论文】Cross-domain Named Entity Recognition via Graph Matching 最近到了研一下学期&#xff0c;很多身边的同学也开始有了成果&#xff0c;但本菜鸡一点成果都没有【大哭】所以也没什么好写的。虽然菜鸡口头上不说&#xff0c;但内心也感受到非常之焦虑。最近读论…...

代码随想录算法训练营第三十五天|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

文章目录 860.柠檬水找零406.根据身高重建队列452. 用最少数量的箭引爆气球:star: 860.柠檬水找零 链接:代码随想录 5美元相当滴珍贵 解题思路&#xff1a; 情况一&#xff1a;账单是5&#xff0c;直接收下。 情况二&#xff1a;账单是10&#xff0c;消耗一个5&#xff0c;增加…...

爬虫为什么需要多线程

多线程爬虫是一种同时运行多个线程来提高爬取速度的爬虫方式。通过将大量的工作分配给不同的线程&#xff0c;可以减少爬虫的运行时间&#xff0c;提高效率。不过需要注意的是&#xff0c;在爬取过程中需要合理的管理线程数&#xff0c;以避免对被爬取的网站造成过大的负荷。 …...

下一代智能座舱风口下,“超级”Tier 1强势崛起

智能座舱进入全新周期&#xff0c;强者愈强的趋势会快速显现。 可以观察到&#xff0c;智能座舱功能日趋多元化。从多屏互动到舱内全场景多元交互&#xff0c;到更多娱乐平台的上线&#xff0c;智能座舱已经从最初的重多功能转变成重体验。 从架构层面来看&#xff0c;各个功…...

第 三 章 UML 类图

文章目录 前言一、依赖关系&#xff08;虚线箭头&#xff09;二、泛化关系&#xff1a;继承&#xff08;实线空心箭头&#xff09;三、实现关系&#xff08;虚线空心箭头&#xff09;四、关联关系&#xff08;一对一为实线箭头&#xff0c;一对多为实线&#xff09;五、聚合关系…...

java版工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…...

内网穿透实现在外远程连接RabbitMQ服务

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 转载自远控源码文章&#xff1a;无公网IP&#xff…...

抖音数字人主播app

抖音数字人主播app是指一款利用计算机生成的虚拟数字人&#xff0c;在抖音平台上进行实时音视频传输和互动的应用程序。该软件可以让用户创建自己的虚拟数字人&#xff0c;并在抖音平台上进行实时互动和交流。 抖音数字人主播app通常需要包含以下功能&#xff1a; 3D建…...

亚马逊平台使用API接口通过关键字搜索商品

亚马逊公司&#xff08;Amazon&#xff0c;简称亚马逊&#xff1b;NASDAQ&#xff1a;AMZN&#xff09;&#xff0c;2022年营收为5140亿美元&#xff0c; 是美国最大的一家网络电子商务公司&#xff0c;位于华盛顿州的西雅图。是网络上最早开始经营电子商务的公司之一&#xff…...

《花雕学AI》用ChatGPT创造猫娘角色:人工智能角色扮演聊天对话的风险与对策

出于好奇心&#xff0c;我以“ChatGPT&#xff0c;调教猫娘”为题&#xff0c;开始了解ChatGPT角色扮演提示语的用法。ChatGPT给出的介绍是&#xff0c;调教猫娘是一种利用ChatGPT的角色扮演功能&#xff0c;让模型模仿一种类似猫的拟人化生物的行为和语言的活动&#xff0c;并…...

软件测试常规测试过程模型——V模型与X模型

一、V模型简单介绍及讲解 V模型是软件测试过程模型中最广为人知的模型&#xff0c;尽管很多富有实际经验的测试人员还是不太熟悉V模型&#xff0c;或者其它的模型。V模型中的过程从左到右&#xff0c;描述了基本的开发过程和测试行为。V模型的价值在于它非常明确地标明了测试过…...

feign-starter

使用说明 功能 自动装配 设置客户端不主动重试日志打印客户端负载均衡json 转换使用 JacksonUtil 如何引入 com.hete.support xx-feign-starter 如何配置 超时时间 ⚠️ 默认值比较大&#xff0c;需要手动根据实际场景设置 feign: client: config: # 默认配置&#xff0c;…...

FVM初启,Filecoin生态爆发着力点在哪?

Filecoin 小高潮 2023年初&#xff0c;Filecoin发文分享了今年的三项重大变更&#xff0c;分别是FVM、数据计算和检索市场的更新&#xff0c;这些更新消息在发布后迅速吸引了市场的广泛关注。 特别是在3月14日&#xff0c;Filecoin正式推出了FVM&#xff0c;这一变革使得Filec…...

对比度亮度调整与通道分离合并

对比度亮度调整与通道分离合并 对比度亮度调整: 1)原理介绍: g’ g * Mult Add ⚫ g 表示原图像像素 ⚫ g’ 表示输出图像像素 ⚫ Mult 被称为增益(gain), 通常用来控制图像的对比度 ⚫ Add 通常被称为偏置(bias), 通常用来控制图像的亮度 g’(i,j) Mult * g(i,j) Add …...

Java终止线程

1、正常运行结束 程序运行结束&#xff0c;线程自动结束。 2、使用stop方法强制终止 不安全&#xff0c;不建议使用&#xff1a; 调用 stop() 方法会立刻停止 run() 方法中剩余的全部任务&#xff0c;包括在 catch 或 finally 语句中的&#xff0c;并抛出ThreadDeath异常&a…...

Qt的Qss用法

Qt 的 Qss 是一种用于定义用户界面的样式表语言。它可以用来定义控件的颜色、字体、边框、背景等样式&#xff0c;可以很方便的实现自定义的样式效果。 Qss 的基本语法和 CSS 类似&#xff0c;主要是由选择器和样式属性构成。 选择器 选择器用来指定要样式化的控件&#xff…...

数塔dp -A

文章目录 数塔dp -A程序设计程序分析数塔dp -A 【问题描述】 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点, 则经过的结点的数字之和最小是多少? 已经告诉你了,这是个DP的题目,你…...

Spring MVC 接收 json 和返回 json (14)

目录 总入口 测试case 源码分析 1. 针对RequestBody的参数解析 2. 针对 ResponseBody 的返回值处理 总入口 通过上一篇Spring MVC 参数解析&#xff08;13&#xff09;_chen_yao_kerr的博客-CSDN博客的说明&#xff0c;相信大家对Sping MVC的参数解析有了一定的了解&…...

从零开始搭建自己的POC库:GitHub爬取+本地管理全攻略

从零构建个人POC武器库&#xff1a;自动化采集与智能管理实战指南 在漏洞研究和渗透测试领域&#xff0c;拥有一个组织良好的POC&#xff08;Proof of Concept&#xff09;库就像战士拥有趁手的武器。本文将带你从零开始&#xff0c;通过自动化工具和系统化方法&#xff0c;打造…...

如何为Windows任务栏添加现代圆角设计:RoundedTB完全配置指南

如何为Windows任务栏添加现代圆角设计&#xff1a;RoundedTB完全配置指南 【免费下载链接】RoundedTB Add margins, rounded corners and segments to your taskbars! 项目地址: https://gitcode.com/gh_mirrors/ro/RoundedTB 厌倦了Windows系统任务栏千篇一律的方正外观…...

OpenHarmony标准系统选Linux内核,为啥首选LTS版本?聊聊4.19、5.10和6.6的适配实战

OpenHarmony标准系统选Linux内核&#xff1a;LTS版本决策逻辑与实战适配指南 当OpenHarmony标准系统遇上Linux内核选型&#xff0c;技术决策者们往往面临一个关键抉择&#xff1a;是追求前沿特性拥抱最新稳定版&#xff0c;还是坚守长期支持&#xff08;LTS&#xff09;版本的稳…...

51单片机外部中断实战:电平与边沿触发的按键检测优化方案

1. 51单片机外部中断基础入门 第一次接触51单片机外部中断时&#xff0c;我完全被那些专业术语搞晕了。什么电平触发、边沿触发&#xff0c;听起来就像天书一样。但实际用起来才发现&#xff0c;这其实是单片机最实用的功能之一。想象一下&#xff0c;你正在用单片机做一个智能…...

5个痛点解决:ComfyUI-KJNodes让工作流效率提升60%的实战指南

5个痛点解决&#xff1a;ComfyUI-KJNodes让工作流效率提升60%的实战指南 【免费下载链接】ComfyUI-KJNodes Various custom nodes for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-KJNodes ComfyUI-KJNodes是一套功能强大的ComfyUI自定义节点集合&…...

JY61P陀螺仪串口数据解析实战:从协议到STM32代码实现

1. JY61P陀螺仪模块初探 第一次拿到JY61P这个六轴姿态传感器时&#xff0c;我下意识以为它和常见的MPU6050差不多。但实际用下来发现&#xff0c;这个国产模块在精度和易用性上都有明显优势。最让我惊喜的是它支持串口通信&#xff0c;完美避开了I2C协议那些令人头疼的时序问题…...

Path of Building终极指南:三步解锁流放之路最强角色构建

Path of Building终极指南&#xff1a;三步解锁流放之路最强角色构建 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 想要在《流放之路》中打造完美角色却总是迷失在复杂…...

3个革命性步骤:分布式推理让普通设备实现本地化AI部署

3个革命性步骤&#xff1a;分布式推理让普通设备实现本地化AI部署 【免费下载链接】LocalAI mudler/LocalAI: LocalAI 是一个开源项目&#xff0c;旨在本地运行机器学习模型&#xff0c;减少对云服务的依赖&#xff0c;提高隐私保护。 项目地址: https://gitcode.com/GitHub_…...

城市开车GPS总飘?试试给惯性导航(INS)加个“车轮锁”:NHC/ODO约束原理通俗解读

城市开车GPS总飘&#xff1f;试试给惯性导航&#xff08;INS&#xff09;加个“车轮锁”&#xff1a;NHC/ODO约束原理通俗解读 你是否遇到过这样的场景&#xff1a;开车穿过高楼林立的CBD时&#xff0c;车载导航突然开始"鬼畜漂移"&#xff1f;或是驶入隧道后&#x…...

3步掌握Umi-OCR批量处理:从海量图片中高效提取文字

3步掌握Umi-OCR批量处理&#xff1a;从海量图片中高效提取文字 【免费下载链接】Umi-OCR Umi-OCR: 这是一个免费、开源、可批量处理的离线OCR软件&#xff0c;适用于Windows系统&#xff0c;支持截图OCR、批量OCR、二维码识别等功能。 项目地址: https://gitcode.com/GitHub_…...