[Java Web]Session | 一文详细介绍会话跟踪技术中的Session

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:Java Web

目录

  • Session
  • 1、介绍
  • 2、工作流程
  • 3、工作原理
  • 4、基本使用
  • 5、Session的钝化与活化
    • 5.1、提出问题
    • 5.2、🔺解决问题
  • 6、Session销毁

Session

1、介绍

简单概述Session:

  1. 服务端会话跟踪技术:将数据保存到服务端。
  2. Session是存储在服务端而Cookie是存储在客户端
  3. 存储在客户端的数据容易被窃取和截获,存在很多不安全的因素
  4. 存储在服务端的数据相比于客户端来说就更安全

详细介绍:
  Session(会话)是一个在Web应用程序中跨多个请求维护客户端状态的机制。在Web应用程序中,HTTP协议是无状态的,这意味着每个请求都是独立的,服务器不能识别不同请求之间的关联。Session解决了这个问题,它允许Web应用程序在客户端和服务器之间存储和共享状态数据。
  当客户端第一次访问Web应用程序时,服务器会创建一个唯一的会话ID,并将其存储在客户端的Cookie中。
  会话ID通常是一个长的随机字符串,用于识别客户端。每个后续请求都将包含这个会话ID,使得服务器能够识别客户端,并且能够在不同请求之间共享数据。
  在会话中,可以存储任意数据,例如用户信息、购物车内容等。服务器会将这些数据存储在内存或持久化存储中(如数据库或文件系统),并且只在会话有效期内保留。通常情况下,会话有效期是30分钟到几个小时,但可以根据需要进行配置。
  总之,Session是一种在Web应用程序中维护客户端状态的机制,它通过在客户端和服务器之间存储和共享状态数据,解决了HTTP协议无状态的问题。

2、工作流程

  1. 在服务端的ServletA获取一个Session对象,把数据存入其中
  2. 在服务端的ServletB获取到相同的Session对象,从中取出数据,就可以实现一次会话中多次请求之间的数据共享了

那么如何保证ServletA和ServletB使用的是同一个Session对象?下面进行原理分析

3、工作原理

前提条件:Session是基于Cookie实现的

Session的工作原理如下:

  1. 当客户端第一次访问Web应用程序时,服务器会创建一个唯一的Session ID,这个Session ID通常是一个长的随机字符串。
  2. 服务器将Session ID存储在Cookie中,并将Cookie发送给客户端浏览器。客户端浏览器会将Cookie保存在本地,并在后续的每个请求中发送给服务器。
  3. 当客户端发送一个请求时,服务器会读取请求中的Session ID,并使用它来查找与该Session ID相关联的Session对象。
  4. 如果服务器找到了Session对象,它将使用该对象存储和读取与该会话相关的数据。如果服务器没有找到Session对象,则会创建一个新的Session对象,并将其与Session ID相关联。
  5. 服务器会将Session对象存储在内存或持久化存储中(如数据库或文件系统),并在会话过期之前保留它。
  6. 当客户端关闭浏览器或者Session过期后,服务器会删除该Session对象,并释放与之相关联的资源。关闭打开浏览器后,因为浏览器的cookie已被销毁,所以就没有JESSIONID的数据,服务端获取到的session就是一个全新的session对象

总之,Session的工作原理是通过在客户端浏览器和服务器之间传递Session ID来维护客户端状态,并在服务器上存储和共享会话数据,以便跨多个请求共享和使用该数据。

4、基本使用

在JavaEE中提供了HttpSession接口,来实现一次会话的多次请求之间数据共享功能。

具体的使用步骤为:

  1. 使用request对象获取Session对象->HttpSession session = request.getSession();
  2. Session对象提供的功能:
    a. 存储数据到session域中->void setAttribute(String name,Object o)
    b. 根据Key获取值->Object getAttribute(String name)
    c. 根据Key删除该键值对->void removeAttribute(String name)

下面通过一个简单Demo来实现Session的简单使用:

需求:在一个Servlet中往Session中存入数据,在另一个Servlet中获取Session中存入的数据
1.创建名为SessionDemo1的Servlet类
2.创建名为SessionDemo2的Servlet类
3.在SessionDemo1的方法中:获取Session对象、存储数据
4.在SessionDemo2的方法中:获取Session对象、获取数据
5.启动测试

创建SessionDemo1并存储数据:

创建SessionDemo2并获取数据:

启动Tomcat服务器,访问sessionDemo1,然后再访问sessionDemo2,查看控制台,可以看到:

此时查看浏览器缓存的Cookie:

下面在代码中测试两次获取的Session是不是同一个对象:

可以看到,是同一个对象。这是通过第一次获取对象生成的JESSIONID唯一标识来识别的。

前面讲工作原理的时候提到,如果把浏览器关闭或者开启新的会话窗口,那么Session对象就会不一样。同时,如果把浏览器关闭再重新打开,去查看浏览器缓存的Cookie时,会发现之前存储的Session对象的Cookie被销毁了。

这也很好的印证了:Session是基于Cookie实现的,Session本质上还是实现的同个会话中的数据共享。

5、Session的钝化与活化

5.1、提出问题

服务器重启后,Session对象存储的数据是否还在?
  按照上面讲到的,服务器重启的时候,同时也释放了内存,那么Session存储的数据也应该是被销毁了。

举个例子简单引入:
  用户把需要购买的商品添加到购物车,因为要实现同一个会话多次请求数据共享,所以假设把数据存入Session对象中。此时用户有事离开一会,在这期间服务器重启了,等用户回来结算的时候发现购物车的数据没了,那么这显然不符合我们日常的需求。

但是实际上,Tomcat服务器在正常关闭和重启的时候,Session的数据并不会被销毁。

5.2、🔺解决问题

如何实现:Session的钝化和活化

  1. 钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中
    钝化的数据路径为:项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser
  2. 活化:再次启动服务器后,从文件中加载数据到Session中。
    数据加载到Session中后,路径中的SESSIONS.ser文件会被删除掉

6、Session销毁

  
session的销毁有两种方式:

  1. 默认情况下,无操作,30分钟自动销毁
    a. 对于这个失效时间,是可以通过配置进行修改的
    b. 在项目的web.xml中配置

    c. 如果没有配置,默认是30分钟,默认值是在Tomcat的web.xml配置文件中:

  2. 调用Session对象的invalidate()进行销毁
    a.在SessionDemo2类中添加session销毁的方法

    再次访问服务器,会发现对象已经被销毁了。

    b.在实际使用中,该销毁方法一般会在用户退出的时候,需要将session销毁掉。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言蓝桥杯每日一题】—— 递增序列

【C语言蓝桥杯每日一题】—— 递增序列😎前言🙌递增序列🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者…

软考中级-软件工程

1 软件过程1.1 能力成熟度模型(CMM)初始(混乱)->可重复(建立基本、重复以往)->已定义(文档化、标准化)->已管理(制定产品质量标准)->优化&#x…

HTML5 SSE

HTML5 服务器发送事件(Server-Sent Events) 服务器发送事件(Server-sent Events)是基于 WebSocket 协议的一种服务器向客户端发送事件和数据的单向通讯。 HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新。…

快速将PDF转换为图片:免费的在线PDF转换器

在现代数字时代,PDF是一种非常常见的文件格式。它们在学术界,商业领域和许多其他领域中被广泛使用。有时,您可能需要将PDF文件转换为图像格式,以便能够方便地与他人共享和使用。在这种情况下,您可以使用免费的在线PDF转…

PyCharm 配置sqlite3驱动

在PyCharm中可以查看sqlite3数据库,具体要如何做呢? 数据库入口 打开PyCharm, 在最右侧,有一个Database的表示,点击如下图所示。 如果没有找到这个选项, 点击View -> Tool Windows -> Database同…

chatgpt实际是怎样工作的?

文章翻译自: https://www.assemblyai.com/blog/how-chatgpt-actually-works/ ChatGPT 是 OpenAI 的最新语言模型,比其前身 GPT-3 有了重大改进。与许多大型语言模型类似,ChatGPT 能够为不同目的生成多种样式的文本,但具有更高的精…

MBD-有感(Hall)开环BLDC控制模型(下)

目录 前面 保护策略 DC_Bus_Measurements Protection_Check 外设配置 最后 前面 上一篇已经把霍尔有感BLDC开环控制模型的主要部分分析完成了 MBD-有感(Hall)开环BLDC控制模型(上) 语雀 这一篇分析一些边边角角,但不成体系的部分。…

全网最详细,Jmeter接口测试场景-万条测试数据校验结果,循环断言(案例)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 在工作中&#xff0…

这个ChatGPT插件可以远程运行代码,还生成图表

ChatGPT的插件使数据科学成为一种简单、愉快的体验 我们做数据分析时一般都是使用这样的流程来进行:运行jupyter notebook、安装库、解决依赖关系和版本控制,数据分析,生成图表。ChatGPT的“Code Interpreter”插件可以帮助我们进行数据分析…

【Redis】五大数据结构及其常用指令

文章目录说明String类型List类型Set类型Hash类型Sorted Set 排序集合总结说明 Redis里面的数据类型有String、List、Set、Hash、Zset。这篇文章会介绍这5种数据类型并介绍操作它们的指令. String类型 字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的&#xff0…

5.1.1 Ext JS之Grid actioncolumn动作列的动态显示

在Ext JS 的 Grid中添加动作列的方式是配置一个 actioncolumn类型的动作列,这个动作列可以包含多个图表的按钮。 添加的方式如下: {xtype: actioncolumn,items:[{iconCls: x-fa fa-trash,}]}在有的时候场景中, 会根据不同行的数据来决定是否显示动作按钮, 也就是最后的效果…

关于OpenAI的DALL的一点使用心得

文章目录注册DALL使用根据描述来generate上传图片来generate也可以根据描述信息或者相似的图片来进行设计注册DALL https://openai.com/product/dall-e-2 使用 根据描述来generate surprise me 自动生成描述(因为每个月只有15个免费credits,节省起见…

java面试题(持续更新)

java面试题(持续更新) java 基础 java面向对象有哪些特征 面向对象的三大特征:封装、继承、多态 封装:隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据,…

Microsoft Dynamics 365 Business Central Planning Worksheet中Action Message状态变化

学习目标: 掌握Planning Worksheet中Action Message状态变化 学习内容: 掌握 创建物料,工作中心,工艺路线,BOM,物料和工艺路线,BOM的关联掌握 按订单的生产的物料卡片设置掌握 创建销售订单并…

二叉树的5个性质【要点:完全二叉树的性质】

只讲不会的 普通二叉树就要讲排列顺序了!!! 预备:满二叉树:1.前提是它必须是二叉树 2.每个结点(除了终端结点外)都是2个子女。 要点1:关于普通的树的结点的计算&#xff0…

【CocosCreator入门】CocosCreator组件 | Label(文本)组件

Cocos Creator 是一款流行的游戏开发引擎,具有丰富的组件和工具,其中Label组件是最常用的之一。Label 组件是一个用于显示文本的 UI 组件。在本文中,我们将探讨 Label 组件的一些技术方面,包括如何创建、配置和使用它。 目录 一、…

java的集合体系结构(以及集合的遍历方式)

文章目录java集合的体系结构遍历方式通用(三种):迭代器,增强for,lambda表达式遍历迭代器(不依赖索引,适合set集合遍历)java集合的体系结构 注意点: Col1 ection是一个接口,我们不能直接创建他的对象。 所以,现在我们学习他的方法时&#xff0…

【数据库管理】①实例与数据库

1.Oracle RDBMS 架构图 2. Oracle 体系结构 由此区分database和instance的区别 No.1.oracle serverdatabase instance2.databasedata file、control file、redo log file3.instancean instance accesses a database4.oracle memorySGA PGA(oracle的内存结构)5.instanceSGA …

用C语言写一个函数,把字符串转换成整数

这是一个很有意思的问题。请不要把这个问题想的太简单了,考虑问题时应该尽可能的全面一些。请先思考并且实现这个函数,再来看讲解。 分析一下:函数名是StrToInt,那么可以这么调用: int ret StrToInt("1234&quo…

前端后端交互系列之Jquery下的Ajax

目录前言Jquery发送Ajax请求1. 引入jquery文件2. 页面结构3. 发送get请求4. 发送post请求5. 通用方法总结前言 本篇文章讲解的是Jquery下的Ajax。Jquery到现今用的不是很多,但是会有老的项目依旧使用Jquery,所以了解用Jquery实现利用ajax进行交互是有必…
最新文章