(十四)Servlet教程——Servlet中HttpSession的使用

news2025/1/12 1:09:24

        除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,相应地也增加了服务器的存储压力。

1. 什么是Session

        Session是另外一种记录客户端状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。Session是一种连接状态变量,客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要客户档案表就可以了。

2. Session的使用

        Session对应的类为javax.servlet.http.HttpSession类。每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。Session是在客户端第一次请求服务器的时候创建的。Session也只有key-value的属性对,Session是一种集合型变量,可以存储多个key-value类型值对,key为字符串类型,value可以为任何对象类型。

通过getAttribute(String key)和setAttribute(String key,Object value)方法读写客户状态信息。Servlet通过request.getSession()方法获取该客户的Session。

        当多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见。

        Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力。

3. Session的生命周期和有效期

        Session保存在服务器端,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时就可能会导致内存溢出,因此,Session里的信息应该尽量精简。

        Session在用户第一次访问服务器时自动创建。需要注意的是,只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

        Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户访问服务器一次,无论是否读写Session,服务器都认为该用户的Session活跃了一次。

        由于有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把一段时间内没有活跃的Session从内存中删除。这段时间就是Session的超时时间。如果超过了超时时间没有访问过服务器,Session就自动失效了。

        Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(long interval)修改。

        Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法也可以使Session失效。

        Tomcat中Session的默认超时时间为30分钟。通过setMaxInactiveInterval(int seconds)修改超时时间。

        可以修改web.xml改变Session的默认超时时间。例如修改为60分钟。

        web.xml文件存放路径在Tomcat目录的conf文件夹中。

 <session-config>

    <session-timeout>60</session-timeout>

</session-config>

        web.xml中超时时间的单位为分钟,而setMaxInactiveInterval单位为秒。

下面通过例子来说明HttpSession的使用

首先创建一个Servlet,Session01继承自HttpServlet

        //获取Session对象

        HttpSession session=request.getSession();

        //获取Session的会话标识符

        String id=session.getId();

        System.out.println(id);

        //获取Session的创建时间

        System.out.println(session.getCreationTime());

        //获取最后一次访问时间

        System.out.println(session.getLastAccessedTime());

        //判断是否是新的session对象

        System.out.println(session.isNew());

        当获取Session对象时,会判断Session对象是否存在,存在就获取,没有就创建

IsNew()是true是新的对象,否则不是新的对象。

Session既然是为了标识一次会话,那么此次会话就应该有一个唯一的标志,这个标志就是SessionId。

        每当一次请求到达服务器,如果开启了会话(访问了Session),服务器第一步会查看是否从客户端回传一个名为JSESSIONID的cookie,如果没有则认为这是一次新的会话,会创建一个新的session对象,并用唯一定的sessionId为此次会话做一个标志。如果有JSESSIONID这个cookie回传,服务器则会根据JSESSIONID这个值去查看是否含有id为JSESSIONID的session对象,如果没有则认为是一个新的会话,重新创建一个新的session对象,并标志此次会话;如果找到了相应的session对象,则认为是之前标志过的一次会话,返回该session对象,数据达到共享。

        这里提到一个叫做JSESSIONID的cookie,这是一个比较特殊的cookie,当用户请求服务器时,如果访问了session,则服务器会创建一个名为JSESSIONID,值为获取到的session的sessionid的cookie对象,并添加到response对象中,响应给客户端,有效时间为关闭浏览器。

        所以Session的底层依赖Cookie来实现。

Session域对象

        Session用来标识一次会话,在一次会话中数据是可以共享的,这时Session作为域对象存在,可以通过setAttribute(name,value)方法向域对象中添加数据,通过getAttribute(name)从域对象中获取数据,通过removeAttribute(name)从域对象中移除数据。

        下面重新创建一个Servlet来讲解Session的域对象。

        创建一个Session02类,继承自HttpServlet。

setAttribute设置Session域对象

removeAttribute移除Session域对象

//获取Session对象

HttpSession session=request.getSession();

//设置Session域对象

session.setAttribute("uname","admin");

session.setAttribute("upwd","123456");

//移除Session对象

session.removeAttribute("upwd");

//设置request域对象

request.setAttribute("name","request_name");

//请求转发到JSP页面

request.getRequestDispatcher("index.jsp").forward(request,response);

        然后创建一个Index.jsp页面来接收这些Session域对象和Request域对象

        请求转发是一次请求,request作用域有效,session作用域有效

但是在该版本的Idea中out.print方法无法解析

点击Idea菜单中的文件→项目结构

点击项目结构后的界面展示如下图所示

选择选项卡中的“依赖”选项卡,然后点击项目结构中的“加号”

点击“加号”后的界面展示如下图所示,选择“库”

 然后选中Tomcat 8.5.99,然后点击“添加所选项”按钮

然后红色的提示就会消失。

启动该web程序

然后使用URL地址 http://localhost:8080/s001/ser02

界面结果如下图所示

        其中uname和upwd是Session域对象,但是upwd在设置后被移除了。name是Request域对象,请求转发到JSP后都可以获取到。

        然后把请求转发的代码改为重定向的代码,代码示例如下图所示

        重定向是两次请求,session还可以获取,request不能获取

再次重启该Web应用,再次访问ser02,结果如下图所

 

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

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

相关文章

线程池嵌套导致的死锁问题

1、背景 有一个报告功能&#xff0c;报告需要生成1个word&#xff0c;6个excel附件&#xff0c;总共7个文件&#xff0c;需要记录报告生成进度&#xff0c;进度字段jd初始化是0&#xff0c;每个文件生成成功进度加1&#xff0c;生成失败就把生成状态置为失败。 更新进度语句&…

Vue入门到关门之Vue项目工程化

一、创建Vue项目 1、安装node环境 官网下载&#xff0c;无脑下一步&#xff0c;注意别放c盘就行 Node.js — Run JavaScript Everywhere (nodejs.org) 需要两个命令 npm---->pipnode—>python 装完检查一下&#xff0c;hello world检测&#xff0c;退出crtlc 2、搭建vu…

Linux:浏览器访问网站的基本流程(优先级从先到后)

浏览器访问网站的基本流程&#xff08;优先级从先到后&#xff09; 首先查找浏览器是否存在该网站的访问缓存 其次查找本机的域名解析服务器 windows&#xff1a;C:\Windows\System32\drivers\etc\hostsLinux&#xff1a;/etc/hosts 使用外部的域名解析服务器解析&#xff…

逆向第一步 去掉debugger(无任何门槛小白可学习)

准备工具 1.ReRes 地址&#xff1a;ReRes 用法&#xff1a; 用法 2.nodepad 地址&#xff1a;nodepad 注意下载后缀为.x64.exe版本的 我这里下的npp.8.6.5.Installer.x64.exe 3给nodepad装上JSTool插件 下载 可省略下叙详细步骤点此链接直接下载 JSToolNpp 然后到导…

Go语言基本语法(三)指针

什么是指针 在Go语言中&#xff0c;"指针是一种存储变量内存地址的数据类型"&#xff0c;意味着指针本身是一个特殊的变量&#xff0c;它的值不是数据本身&#xff0c;而是另一个变量在计算机内存中的位置&#xff08;地址&#xff09;。形象地说&#xff0c;就像存…

Avalonia .NET构建Linux桌面应用

目录 &#x1f47b;前言 &#x1f4bb;安装Avalonia &#x1f4e6;创建项目 &#x1f4da;在win下运行 ​&#x1f511;打包发布​编辑 &#x1f4fb;在linux下运行 环境WIN10 VS2022 debian &#x1f47b;前言 Avalonia 是一个用于创建跨平台用户界面 (UI) 的开源框架…

C++——STL容器——vector

vector是STL容器的一种&#xff0c;和我们在数据结构中所学的顺序表结构相似&#xff0c;其使用和属性可以仿照顺序表的形式。vector的本质是封装了一个动态大小的数组&#xff0c;支持动态管理容量、数据的顺序存储以及随机访问。 1.前言说明 vector作为容器&#xff0c;应该…

对6个默认成员函数的总结

前言&#xff1a;本篇文章是对六大默认成员函数的自我总结&#xff0c;不适合刚入门的新人学习。适合想进一步深入了解六大默认成员函数的人学习。 1.构造函数&#xff1a;给对象初始化的函数&#xff0c;相当于之前写的Init函数。 构造函数的特性&#xff1a; 对内置类型不…

深度解析:人工智能作画算法的原理与技术

引言 在数字艺术的探索中&#xff0c;人工智能&#xff08;AI&#xff09;作画算法以其独特的创造性和艺术性引起了广泛的兴趣。这些算法不仅仅是简单的图像处理工具&#xff0c;它们背后蕴藏着复杂的神经网络和深度学习模型。本文将深入探讨AI作画算法的原理与技术&#xff0…

day15 学一下Tailwindcss(java转ts全栈/3r教室)

目前距离全栈差得最多的是前端&#xff0c;而对于前端主要是CSS一直不熟悉&#xff0c;觉得很复杂写起来总是不上道&#xff0c;所以特别关注下Tailwindcss吧&#xff0c;其他前端框架可以先放放&#xff0c;多说无益直接用tailwindcss做个页面试试 看下文档&#xff1a;Tailwi…

【LeetCode刷题记录】104. 二叉树的最大深度

104 二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff…

HarmonyOS开发案例:【排行榜页面】

介绍 本课程使用声明式语法和组件化基础知识&#xff0c;搭建一个可刷新的排行榜页面。在排行榜页面中&#xff0c;使用循环渲染控制语法来实现列表数据渲染&#xff0c;使用Builder创建排行列表布局内容&#xff0c;使用装饰器State、Prop、Link来管理组件状态。最后我们点击…

基于python+django网易新闻+评论的舆情热点分析平台

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

回溯Backtracking Algorithm

目录 1) 入门例子 2) 全排列-Leetcode 46 3) 全排列II-Leetcode 47 4) 组合-Leetcode 77 5) 组合总和-Leetcode 39 6) 组合总和 II-Leetcode 40 7) 组合总和 III-Leetcode 216 8) N 皇后 Leetcode 51 9) 解数独-Leetcode37 10) 黄金矿工-Leetcode1219 其它题目 1) 入…

LeetCode45:跳跃游戏Ⅱ

题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n …

SAP PP学习笔记08 - 作业区(工作中心Work Center),作业区Customize

上一章讲了作业手顺&#xff08;工艺路线Routing&#xff09;。 SAP PP学习笔记07 - 作业手顺&#xff08;工艺路线Routing&#xff09;-CSDN博客 这一章来讲讲作业区&#xff08;工作中心 Work Center&#xff09;。 1&#xff0c;作业区&#xff08;工作中心&#xff09;中…

Linux挂载硬盘

1、查看硬盘数量 fdisk -l # 可以看到三个磁盘 # /dev/vda 50G # /dev/vdb 100G 新增 # /dev/vdc 100G 新增2、查看当前挂载情况 df -h # 可以看到50G的已经挂载3、格式化待挂载盘 # 对新的数据盘进行挂载前要进行格式化&#xff0c;只有格式化后才可以挂载 mkfs.ext4 /dev/…

2024年这样做抖音小店,操作简单,起店稳定!

大家好&#xff0c;我是电商糖果 不少朋友说跟糖果抱怨过&#xff0c;说抖音小店越来越难做了。 平台的规则越来越多&#xff0c;商家运营店铺的时候&#xff0c;很容易出现违规预警。 糖果是2020年开始做的抖音小店&#xff0c;现在已经经营了多家小店。 实话实说确实比之…

一站式AI创作平台:融合GPT会话、GPTs应用、Midjourney视觉艺术与Suno AI音乐合成模块

一、系统简介 星河易创AI系统基于ChatGPT的核心技术打造&#xff0c;集成了自然语言问答和艺术创作功能。该系统兼容Midjourney绘画技术&#xff0c;并支持官方GPT模型。它提供了多样化的应用&#xff0c;包括GPTs的多场景应用、实时GPT语音对话能力、GPT-4模型的先进特性&…

扩展大型视觉-语言模型的视觉词汇:Vary 方法

在人工智能领域&#xff0c;大型视觉-语言模型&#xff08;LVLMs&#xff09;正变得越来越重要&#xff0c;它们能够处理多种视觉和语言任务&#xff0c;如视觉问答&#xff08;VQA&#xff09;、图像字幕生成和光学字符识别&#xff08;OCR&#xff09;。然而&#xff0c;现有…