Servlet的会话管理机制

2023-11-13

一、Servlet的会话管理机制

根据设计,HTTP是一种无状态的协议。它意味着Web应用并不了解有关同一用户以前请求的信息。维持会话状态信息的方法之一是使用Servlet 或者JSP容器提供的会话跟踪功能。Servlet API规范定义了一个简单的HttpSession接口,通过它我们可以方便地实现会话跟踪。

HttpSession接口提供了存储和返回标准会话属性的方法。标准会话属性如会话标识符、应用数据等,都以“名字-值”对的形式保存。简而言 之,HttpSession接口提供了一种把对象保存到内存、在同一用户的后继请求中提取这些对象的标准办法。在会话中保存数据的方法是 setAttribute(String s, Object o),从会话提取原来所保存对象的方法是getAttribute(String s)。

在HTTP协议中,当用户不再活动时不存在显式的终止信号。由于这个原因,我们不知道用户是否还要再次返回,如果不采取某种方法解决这个问题,内存中会积累起大量的HttpSession对象。

为此,Servlet采用“超时限制”的办法来判断用户是否还在访问:如果某个用户在一定的时间之内没有发出后继请求,则该用户的会话被作废,他的 HttpSession对象被释放。会话的默认超时间隔由Servlet容器定义。这个值可以通过getMaxInactiveInterval方法获 得,通过setMaxInactiveInterval方法修改,这些方法中的超时时间以秒计。如果会话的超时时间值设置成-1,则会话永不超时。 Servlet可以通过getLastAccessedTime方法获得当前请求之前的最后一次访问时间。

要获得HttpSession对象,我们可以调用HttpServletRequest对象的getSession方法。为了正确地维持会话状态,我们必须在发送任何应答内容之前调用getSession方法。

用户会话既可以用手工方法作废,也可以自动作废。作废会话意味着从内存中删除HttpSession对象以及它的数据。例如,如果一定时间之内(默认30分钟)用户不再发送请求,Java Web Server自动地作废他的会话。

Servlet/JSP会话跟踪机制有着一定的局限,比如:

会话对象保存在内存之中,占用了可观的资源。

会话跟踪依赖于Cookie。由于各种原因,特别是安全上的原因,一些用户关闭了Cookie。

会话跟踪要用到服务器创建的会话标识符。在多个Web服务器以及多个JVM的环境中,Web服务器不能识别其他服务器创建的会话标识符,会话跟踪机制无法发挥作用。

要深入理解会话跟踪机制,首先我们必须理解在Servlet/JSP容器中会话如何运作。

二、会话标识符

每当新用户请求一个使用了HttpSession对象的JSP页面,JSP容器除了发回应答页面之外,它还要向浏览器发送一个特殊的数字。这个特殊 的数字称为“会话标识符”,它是一个唯一的用户标识符。此后,HttpSession对象就驻留在内存之中,等待同一用户返回时再次调用它的方法。

在客户端,浏览器保存会话标识符,并在每一个后继请求中把这个会话标识符发送给服务器。会话标识符告诉JSP容器当前请求不是用户发出的第一个请 求,服务器以前已经为该用户创建了HttpSession对象。此时,JSP容器不再为用户创建新的HttpSession对象,而是寻找具有相同会话标 识符的HttpSession对象,然后建立该HttpSession对象和当前请求的关联。

会话标识符以Cookie的形式在服务器和浏览器之间传送。如果浏览器不支持Cookie又如何呢此时,对服务器的后继请求将不会带有会话标识符。 结果,JSP容器认为该请求来自一个新用户,它会再创建一个HttpSession对象,而以前创建的HttpSession对象仍旧驻留在内存中,但该 用户以前的会话信息却丢失了。

另外,Servlet/JSP容器只认可它自己创建的会话标识符。如果同一Web应用在“Web农场”(Web farm)的多台服务器上运行,则必须存在这样一种机制:保证来自同一用户的请求总是被定向到处理该用户第一次请求的服务器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Servlet的会话管理机制 的相关文章

随机推荐

  • Spring Boot 学习研究笔记(十二)Dcoker 中部署SpringBoot jar包

    Linux Centos8 使用 DOCKER 部署JAR包 1 进入项目根目录 cd project 2 创建存放jar包的目录 mkdir springboot test 3 进入 project springboot test 编写D
  • 软件调试之堆和堆检查

    当用户启动一个程序时 系统会将程序文件从外部存储器 硬盘等 加载到内存中 当程序工作时 需要使用内存空间来放置代码和数据 在使用一段内存之前 程序需要以某种方式 API或库函数 发出申请 接受到申请的一方 内存管理器或C运行库 根据申请者的
  • 【Ansible自动化运维实战】使用ansible批量部署开机启动时为字符界面

    Ansible自动化运维实战 使用ansible批量部署开机启动时为字符界面 一 查看当前启动默认的引导目标 二 编辑playbook 三 测试playbook语法 四 运行playbook 五 测试结果 一 查看当前启动默认的引导目标 a
  • 【信息技术】【2018.01】射频功率放大器的行为建模与数字预失真

    本文为奥地利格拉茨技术大学的博士论文 共147页 数字无线发射机中的射频功率放大器 RF PA 是关系到能量消耗和信号质量的关键部件 特别是由于当今宽带多载波调制方法产生的信号峰均比很高 很难构建出能量效率高 满足标准严格线性要求的射频功率
  • 自己动手写basic解释器(一)

    自己动手写basic解释器 刺猬 http blog csdn net littlehedgehog 注 文章basic解释源码摘自梁肇新先生的 编程高手箴言 据他所说这个代码也是网上摘录的 源码解读参考 java编程艺术 java编程艺术
  • 禁止显示状态 错误 LNK1104 无法打开文件“boost_thread-vc142-mt-gd-x64-1_79.lib”

    系列文章目录 文章目录 系列文章目录 前言 一 问题原因 二 解决办法 1 更改vs2019项目配置 2 第二种方法 前言 别人写的工程用vs2019加载 报错如下 一个错误 LNK1104 无法打开文件 boost thread vc14
  • Qt的各版本直接下载地址

    此文章转载自 http blog csdn net piaopiaolanghua article details 53153363 1 http download qt io archive qt 2 http ftp vim org l
  • spark机器学习笔记:设计机器学习系统

    感想 这是一篇机器学习通俗的讲解 我觉得讲得蛮好 特别是我们在设计机器学习系统的时候该怎么做 不是只设计一个机器学习算法就完了 还有很多的事情要做 本文对数据预处理归纳的挺全的 因为从用户获取的数据 不能直接用于机器学习模型的 中间还需要经
  • 上/下拉电阻对GPIO的影响

    疯雨 版权所有 转载请注明 http blog csdn net u010346967 本人菜鸟一枚 有错误的话欢迎指正 1 什么是上 下拉电阻 上拉就是将不确定的信号通过一个电阻嵌位在高电平 电阻同时起限流作用 下拉同理 上拉是对器件注入
  • 【Redis】Redis 通用命令、键的过期策略

    文章目录 一 基础命令 SET 和 GET 二 全局命令 KEYS EXISTS DEL EXPIRE 和 TTL 经典面试题 Redis 中 key 的过期策略是怎么实现的 TYPE Redis 有许多种数据结构 但是这些数据结构的 ke
  • Go中的Map实现机制

    Go中的Map实现机制 一 map的使用方式 初始化 func main 初始化方式一 make m make map string interface 10 初始化方式二 字面量初始化 m2 map string interface 增删
  • SphereEx张亮:“开源和商业化不能形成对立”

    开源创业 近两年在国内受到广泛关注 但是 想要挖掘一个开源项目的商业价值并非易事 开源创业也缺乏成功先例 那开源创业的道路该怎么走 本期 开源访谈录 邀请到了开源创业领域的探路者张亮与我们分享他的实践经验 本期受访嘉宾 张亮 SphereE
  • QT支持https及编译OpenSSL

    文章目录 搞懂Qt OpenSSL的具体原因 一 如何找到和自己Qt版本真正合适的库并编译 二 编译自己真正所需的OpenSSL库 1 下载OpenSSL 以我所需要的1 0 2o为例 2 配置编译环境及工具ActivePerl 2 1 由
  • 小程序二手商城

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 来自Pycharm的善意提醒,那些值得你注意的小细节(持续更新)

    文章目录 前言 关于更新 python 编码规范 命名类 类名称需要使用驼峰命名 函数中的变量需要使用小写 外部作用域的重复命名 排版类 PEP 8 文件末尾没有新的行 PEP 8 太多的空行 PEP 8 单行代码长度过长 PEP 8 代码
  • mysql强制走索引

    在一张表中 仅有千万级别的数据 现在我有一个SQL语句 我该增加的索引都增加了 但是执行速度很慢 我们经过分析执行的SQL语句得到如下 是因为 在查询的时候 使用的索引错误了 也可以强制其走指定的索引 select from table f
  • 【C++心愿便利店】No.5---构造函数和析构函数

    文章目录 前言 一 类的6个默认成员函数 二 构造函数 三 析构函数 前言 个人主页 小沈YO 小编介绍 欢迎来到我的乱七八糟小星球 专栏 C 心愿便利店 本章内容 类和对象 记得 评论 点赞 收藏 关注 哦 提示 以下是本篇文章正文内容
  • 跨年烟花 html 代码汇总

    此篇汇总了一些笔者觉得好玩又可简单实现的烟花代码 多多支持大佬们的创作 烟花代码1 https blog csdn net u013343616 article details 122233674 样例 更改这里的文字可以更改弹出文字 烟花
  • 白盒测试流程图及测试用例设计(软件测试实验报告)

    白盒测试流程图及测试用例设计 1 课程设计目的 1 理解白盒测试原理 2 绘制白盒测试流程图 2 课程设计方法 1 绘制流程图 2 设计测试用例 3 课程设计内容 题目 输入x和y值 首先判断x和y是否为正数 如果是正数 那么计算两者的数值
  • Servlet的会话管理机制

    一 Servlet的会话管理机制 根据设计 HTTP是一种无状态的协议 它意味着Web应用并不了解有关同一用户以前请求的信息 维持会话状态信息的方法之一是使用Servlet 或者JSP容器提供的会话跟踪功能 Servlet API规范定义了