【JavaEE】B/S结构系统的会话机制_session机制

news2024/11/18 13:57:40

session机制

  • 什么是会话?
  • session机制
    • 为什么需要session对象来保存会话状态呢?
    • 只要B和S断开了,那么关闭浏览器这个动作,服务器知道吗?
    • 为什么不使用request(ServletRequest)对象保存会话状态?为什么不使用application(ServletContext)对象保存会话状态?
  • 思考:session对象的实现原理
    • ❤️如何获取session?
    • session超时机制
    • ❤️session的实现原理
    • 为什么关闭浏览器,会话结束?
    • Cookie禁用了,session还能找到吗?
    • Cookie禁用了,session机制还能实现吗?
  • 总结

什么是会话?

会话对应的英文单词:session

  • 用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这整个过程叫做:一次会话,会话在服务器有一个对应的Java对象,这个Java对象就叫做:session
    什么是一次请求:
    用户在浏览器上点击了一下,然后到页面停下来,可以粗略认为是一次请求,请求对应的服务器也有个Java对象是:request

  • 在一次会话中可以进行多次请求;

Javaservlet规范当中,session对应的类名:HttpSessionjakarta.servlet.http.HttpSession)

session机制

session机制属于B/S结构的一部分,如果使用php语言开发WEB项目,同样也是有session这种机制的,session机制实际上是一种规范,然后不同的语言对这种会话机制都有实现。

session对象最主要的作用:保留会话状态。(用户登录成功了,这是一种登录成功的状态,使用session来保存会话状态)

为什么需要session对象来保存会话状态呢?

  • 因为Http协议是一种无状态协议,Session不能依据HTTP连接来判断是否为同一个用户。
  • 无状态:请求的时候,B和S是连接的,但是请求结束之后,连接断了,为什么要这么做?Http协议为什么要设计成这样?减少服务器的压力,请求的瞬间是连接的,请求结束之后连接断开,这样服务器压力小

只要B和S断开了,那么关闭浏览器这个动作,服务器知道吗?

  • 不知道,服务器是不知道浏览器关闭的。

为什么不使用request(ServletRequest)对象保存会话状态?为什么不使用application(ServletContext)对象保存会话状态?

  • request.setAttribute()存,request.getAttribute()取,ServletContext也有这个方法,request是请求域,ServletContext是应用域。

  • ServletContex对象域太大

  • request请求域(HttpServletRequest)、session会话域(HttpSession)、application应用域(ServletContext

  • request<session<application

  • 一个用户一个会话,如果使用应用域的话,用户之间会混在一起了。(可以自身进行测试,用两个浏览器模拟两个用户,发送请求给服务器时,此时容器里面都是公用同一个应用域的,这样会导致两用户混在一起,不好管理。)

思考:session对象的实现原理

  • HttpSession session = request.getSession();
  • 这行代码很神奇,获取session对象,张三访问的时候获取的session对象就是张三的,李四访问的时候获取的session对象就是李四的,不同用户之间所得到的session对象都不是一致的。它实现了用户之间的不相干性,同时也维持着一次会话。

❤️如何获取session?

  • HttpSession session = request.getSession(); 从服务器中获取当前的session对象, 如果没有获取到任何session对象,则新建;
  • HttpSession session = request.getSession(false); 从服务器中获取session对象 如果获取不到session,则不会新建,返回一个null

session超时机制

session对象销毁情况有两种:

  • 一种是超时销毁
    浏览器关闭的时候,由于Http是一种无状态协议,所以服务器是不知道浏览器关闭的,所以session的销毁要依靠session超时机制。
    在这里插入图片描述

  • 一种是手动销毁
    系统提供了“安全退出”,用户可以点击这个按钮,这样服务器知道你退出了,服务器会自动销毁session对象。这里的实现是在后端代码中调用了session对象的invalidate()方法,使得session对象被销毁。

在这里插入图片描述

❤️session的实现原理

在Web服务器中有一个session列表,类似于map集合,这个map集合的key存储的是session ID

这个map集合的value存储的是对应的session对象,用户发送第一次请求的时候,服务器会创建一个新的session对象,同时给session对象生成一个ID,然后Web服务器会将sessionID发送给浏览器,浏览器将sessionID保存在浏览器的缓存中(浏览器的运行内存中)。

用户发送第二次请求的时候,会自动将浏览器中的sessionID自动发送给服务器,服务器获取到sessionID,然后从session列表中查找到对应的session对象。

为什么关闭浏览器,会话结束?

因为sessionID是在浏览器的运行内存中的,浏览器关闭之后,浏览器中保存的sessionID就消失了,下次重新打开浏览器之后,浏览器缓存中没有这个sessionID,发送请求的时候,请求报文中没有对应的sessionID,服务器自然找不到对应的session对象。session对象找不到等同于会话结束,此时服务器会使用超时机制销毁对象。

Cookie禁用了,session还能找到吗?

cookie禁用是什么意思?服务器正常发送cookie给浏览器,但是浏览器不要了,拒收了。并不是服务器不发了。

  • 找不到session对象了,每一次请求都会产生新的session对象。
    以下是如何禁用所有cookie:
    在这里插入图片描述

Cookie禁用了,session机制还能实现吗?

  • 可以,需要使用URL重写机制!设置URL的参数。URL重写机制提高开发者的成本,开发人员在编写任何请求路径的时候,后面都要添加一个sessionID,给开发带来了很大的难度,很大的成本,所以大部分的网站都是这样设计的:你要是禁用cookie,你就别用了!

如何设置URL参数呢?
URL路径段有三个组件=》参数param ;)组件、查询query ?)组件、片段frag #)组件。
参数组件负责解析URL的应用程序需要这些协议参数来访问资源,以分号(;)与资源定位路径分割。

首先复制以下sessionID
在这里插入图片描述
然后配置参数:
在这里插入图片描述
可以通过地址发现是同一个session对象!!!

总结

  1. 其实sessionID就是Cookie,是由服务器自动发送的名为JESSIONIDCookie,不需要程序员手动去创建;
  2. session之所以可以实现识别不同用户的功能,就是因为sessionID(Cookie)
  3. 这个sessionID对应的CookiemaxAge就是默认为-1的,也就是说这个Cookie不是在硬盘中而是在运行内存中的,关闭浏览器后浏览器就没了;
  4. 为什么会引入Session会话机制,就是因为Http是一种无状态协议;
  5. Session的生命周期:Session的生命周期是不固定的,创建时是不固定的,当首次访问JSP文件时,(没有修改page指令的session属性值)那么当容器把jsp翻译成Servlet时会创建Session对象的,那么后面该用户所用的就是这个Session对象了,销毁Session一个是手动调invalidate方法,一个是Session自动超时销毁.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【c++实战项目】——云备份服务器

项目介绍 云备份服务器能够通过浏览器将文件上传到服务器上。并且随时可以通过浏览器进行查看并且下载&#xff0c;其中下载的过程支持断点续传。服务器上有热点管理模块&#xff0c;将非热点文件进行压缩存储&#xff0c;节省服务器的磁盘空间。服务器各个模块的功能介绍 配…

Python入门学习需要知道的100个小技巧,加了几个小时班终于整理出来了

Python新手需要知道的100个小技巧序言最后序言 哈喽兄弟们&#xff0c;今天给大家分享一下Python初学需要知道的100个小技巧~ 1、for循环中的else条件 这是一个for-else方法&#xff0c;循环遍历列表时使用else语句。下面举个例子&#xff0c;比如我们想检查一个列表中是否包…

DNSPod十问陈迪菲:从C到B,鹅厂设计师的中场战事

陈迪菲&#xff0c;腾讯云设计中心总经理&#xff0c;公司设计通道副会长&#xff0c;设计技术委员会委员&#xff0c;腾讯学院优秀讲师&#xff0c;曾于2019年获得新中国成立70周年中国用户体验设计70人提名奖。2010年加入腾讯&#xff0c;10年设计团队项目管理经验&#xff0…

C++手机运动信息管理系统

C手机运动信息管理系统 《程序设计基本能力综合实训》 实训案例名称:手机运动信息管理系统 -----说明文档 本案例主要完成手机运动信息的管理。主要功能包括:用户信息的管理、运动信息的管理、查看运动排行榜、定制运动路线、数据文件操作和退出。 如图 1-1 所示。 图1-1 …

web前端期末大作业 :HTML+CSS+JavaScript+Bootstrap实现响应式网站潮酷音乐网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

初始C语言2【函数 、数组、操作符、关键字、#define 定义常量和宏、指针、结构体】

目录 八、函数 九、数组 1、数组的定义&#xff1a;一组相同类型元素的集合 2、数组的下标 数组的每个元素都有一个下标&#xff0c;下标是从0开始的。 数组可以通过下标来访问元素。 3、数组的使用 十、操作符 1.常见操作符&#xff1a; 举例&#xff1a; 1&#xff…

与图相关的一些矩阵

目录前言正文邻接矩阵(Adjacency matrix)度矩阵(Degree matrix)关联矩阵(Incidence matrix)拉普拉斯矩阵常规拉普拉斯矩阵拉普拉斯矩阵标准化前言 以无向图为例&#xff0c;介绍与图相关的各种矩阵。我们定义下面的图为 GGG&#xff1a; import networkx as nx import matplo…

CSS之背景样式及边框样式

1、背景样式 常用属性&#xff1a; background-color&#xff1a;背景颜色background-image&#xff1a;背景图片background-repeat&#xff1a;背景图片的平铺方式background-position&#xff1a;背景图片的位置background-attachment&#xff1a;背景图随滚动条的移动方式 …

ADI Blackfin DSP处理器-BF533的开发详解19:LAN的网口设计(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 BF533说实话用来做LAN的应用有些许勉强&#xff0c;因为他自己不带网口&#xff0c;要做的话&#xff0c;需要在总线上挂&#xff0c;那…

3D视觉PnP问题

文章目录背景和定义方法分类典型方法P3P(角锥法&#xff09;DLT单应性矩阵分解迭代法EPnP其他延伸总结背景和定义 目前常用的pnp方法有很多&#xff0c;但是本人学习和查阅后发现比较零散&#xff0c;因此&#xff0c;在这里将所学习的方法按照理解分类和总结&#xff0c;并且…

体验了一下火爆全球的 ChatGPT,我惊呆了

这几天&#xff0c;要说编程圈最热的话题&#xff0c;莫过于OpenAI的ChatGPT&#xff0c;写小说&#xff0c;写代码&#xff0c;找BUG&#xff0c;写论文&#xff0c;画漫画&#xff0c;谱曲……简直没有它干不了的事。 趁着下班时间&#xff0c;我也光速注册体验了一下&#…

深度整理总结MySQL——事务专辑

事务前言什么是事务事务的特性事务的状态事务会引发什么问题&#xff1f;解决事物引发的问题手段事务日志Undo Log 日志简单介绍具体实现Buffer PoolBuffer Pool缓存什么&#xff1f;Redo Log日志为什么需要Redo Log?什么是 redo log&#xff1f;redo log要写入磁盘&#xff0…

保姆级教程:手把手教你使用 Keras 搭建神经网络

大家好&#xff0c;本文从0到1详细讲解两种基于Keras的建模方法&#xff1a; 基于Sequential的建模&#xff1b;快速方便&#xff0c;易上手 基于函数式API的建模&#xff1b;易于扩展&#xff0c;灵活性强 文章目录你会学到什么&#xff1f;技术提升导入内置数据集数据缩放和…

【GRU回归预测】基于卷积神经网络结合门控循环单元CNN-GRU实现数据多维输入单输出预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

ChatGPT强悍的编程能力,让我吓出一身冷汗!

最近有好几个人给我安利ChatGPT&#xff0c;说老刘快你去看看吧&#xff0c;这货实在太强了&#xff0c;搞不好我们程序员都失业了。刚开始我都是微微一笑&#xff0c;怎么可能&#xff1f;我之前的观点一直都是在我的有生之年&#xff0c;AI绝对不可能干掉程序员。但是安利的人…

一篇文章让你懂 io流

文件&#xff1a;就是保存数据的地方。文件流&#xff1a;文件在程序中是以流的形式来操作的。流&#xff1a;数据在数据源&#xff08;文件&#xff09;和程序&#xff08;内存&#xff09;之间经历的路径。输入流&#xff1a;数据从文件&#xff08;磁盘&#xff09;到Java程…

Spring-Cloud-Admin-06

前言 admin是用来监控各个服务的状况的&#xff0c;通过前台页面&#xff0c;可以查看我们各个服务的一个状态&#xff0c;是否在线&#xff0c;服务状况的一个框架。 服务端项目使用 admin有服务端和客户端&#xff0c;我们不需要每个服务都导入admin的客户端依赖&#xff0c;…

以太网 网络高可用性(链路聚合、LACP模式、静态手动模式)

2.9.0 以太网 网络高可用性&#xff08;链路聚合、LACP模式、静态手动模式&#xff09; 网络高可用性2.9.0 以太网 网络高可用性&#xff08;链路聚合、LACP模式、静态手动模式&#xff09;一、简介&#xff1a;1、单板可靠性&#xff1a;1.1、实现机柜式的可靠性提升&#xff…

Java#35(多线程扩展)

目录 一.定时器 定时器是一种控制任务延时调用, 或者周期调用的技术 1.Timer定时器(不推荐) 2.ScheduledExecutorService定时器(推荐) 二.并发与并行 三.线程状态 一.定时器 定时器是一种控制任务延时调用, 或者周期调用的技术 1.Timer定时器(不推荐) 代码示范: import …

Microsoft Store无法打开的解决办法【成功解决】

Microsoft Store无法打开解决办法我自己的解决办法其他Bug导致Microsoft Store无法打开的解决办法vpn代理问题使用TLS 1.2其他BUG解决方案成功解决之前我就有安装wsl的想法&#xff0c;但是他要求打开Microsoft Store&#xff0c;我尝试了各种办法&#xff0c;都不行。今天终于…