板块一 Servlet编程:第六节 HttpSession对象全解 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程:第六节 HttpSession对象全解

  • 一、什么是HttpSession
      • Session的本质
  • 二、创建Seesion及常用方法
  • 三、Session域对象
  • 四、Session对象的销毁

在上一节中,我们学习了Servlet五大对象里的第三个Cookie对象,但Cookie是有大小限制和数量限制的,并且越来越多的Cookie代表客户端和服务器的传输量增加,可不可以每次传的时候不传所有Cookie值,而只传一个唯一ID,通过这个ID直接在服务器查找用户信息呢?答案是有的,这就是我们的Session

一、什么是HttpSession

Session的本质

Session是基于Cookie来工作的,同一个客户端每次访问服务器时,只要当浏览器在第一次访问服务器时,服务器设置一个id并保存一些信息(例如登陆就保存用户信息,视具体情况),并把这个id通过Cookie存到客户端,客户端每次和服务器交互时只传这个id,就可以实现维持浏览器和服务器的状态,而这个ID通常是NAME为JSESSIONID的一个Cookie

Session通过HttpSession来实现,HttpSession对象是javax.servlet.http.HttpSession的实例,该接口并不像HttpServletRequest或HttpServletResponse还存在一个父接口,该接口只是一个纯粹的接口。这因为Session本身就属于HTTP协议的范畴。

对于服务器而言,每一个连接到它的客户端(浏览器)都是一个Session,Servlet容器使用Session创建客户端服务器之间的会话。会话将保留指定的时间段,能处理多个来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。

Session时序图
在这里插入图片描述

Session无论客户端还是服务器端都可以感知到,若重新打开一个新的浏览器,则无法取得之前设置的Session,因为每一个Session只保存在当前的浏览器当中,并在相关的页面取得。我们可以通过request.getSession()方法,来获取当前会话的Session对象。

二、创建Seesion及常用方法

创建Seesion要调用Request对象

request.getSession();

当创建Session对象时,会先判断Session对象是否存在,如果存在则获取Session对象,否则会直接创建一个Session对象

常用方法

  • 获取Session的会话标识符 getId()
  • 获取Session的创建时间(时间戳) getCreationTime()
  • 获取最后一次访问时间 getLastAccessedTime()
  • 判断是否是新的session对象 isNew()

实例
在start.java中导入javax.servlet.http.HttpSession,并在service()方法中添加测试代码

package www.caijiyuan;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;import javax.servlet.http.HttpSession;@WebServlet("/start")
public class start extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取session对象HttpSession session = req.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());}
}

启动服务器,在浏览器中连续访问两次start,控制台分别打印两次访问start的信息
在这里插入图片描述
可以看出来,两次访问都是同一个Session ID,并且第二次访问时,Session最后一次访问的时间已经改变,并且不是新创建的Session对象
如果此时重启浏览器,再访问start,Session ID的值就会改变,说明此Session非彼Session在这里插入图片描述我们在开发者工具中查看Cookie,会发现一个 键为JSESSIONID,值为Session的ID的Cookie,这里提到一个叫做JSESSIONID的Cookie,这是一个比较特殊的Cookie,当用户请求服务器时,如果访问了Session,则服务器会创建一个名为JSESSIONID,值为获取到的Session(无论是获取到的还是新创建的)的sessionld的Cookie对象,并添加到Response对象中,响应给客户端,并且这个Cookie的存活时间被标识成了会话(关闭浏览器)
所以Session的底层依赖Cookie来实现

其实除了使用Cookie还有三种方式让Session正常工作:

  • 通过URL传递SessionID:当浏览器不支持Cookie功能时,浏览器会将用户的SessionCookieName(默认为JSESSIONID)重写到用户请求的URL参数中。格式:/path/Servlet;name=value;name2=value2?Name3=value3
  • 通过隐藏表单传递SessionID:会根据javax.servlet.request.ssl_session属性值设置SessionID
  • 通过SSL传递SessionID

三、Session域对象

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

实例
在start.java中添加数据
start.java

package www.caijiyuan;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import javax.servlet.http.HttpSession;@WebServlet("/start")
public class start extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取session对象HttpSession session = req.getSession();// 设置session域对象session.setAttribute("SessionName","ToomyNike");}
}

在after.java中获取数据并输出,然后移除session域对象
after.java

package www.caijiyuan;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebServlet("/after")
public class after extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();// 获取指定名称的session域对象String SessionName = (String) session.getAttribute("SessionName");System.out.println(SessionName);// 移除指定名称的session域对象session.removeAttribute("SessionName");}
}

启动服务器,先后在浏览器中访问start和after资源,便可在控制台打印得
在这里插入图片描述
如此就实现了一次Session值的设置获取,并且通过Session存储的数据只要一次会话存在它就在设定的之间内一直存在,除非手动销毁。看到这里是不是觉得跟我们在 第三节 HttpServletRequest对象全解与请求转发学到的Request作用域有异曲同工之处?我们将在下一小节ServletContext作用域中为Servlet的三大作用域作总结

四、Session对象的销毁

  • 默认到期时间
    当客户端第一次请求Servlet并操作Session时,Session对象生成,Tomcat中Session默认的存活时间为30min,即不操作界面的时间,一旦有操作,Session会重新计时。可以在Tomcat中的conf目录下的web.xml文件中进行修改默认到期时间。
    实例
    打开D:\...\TOMCAT8.5\apache-tomcat-8.5.93-windows-x64\apache-tomcat-8.5.93\conf目录中的web.xml配置文件,在<session-config>标签处即可设置默认到期时间(分钟)
    在这里插入图片描述
    当然除了以上的修改方式外,我们也可以在程序中自己设定Session的生命周期
  • 手动设置到期时间
    通过session.setMaxlnactivelnterval(int)来设定Session的最大不活动时间,单位为秒
    实例
//获取session对象
HttpSession session = request.getSession();
// 设置session的最大不活动时间
session.setMaxInactiveInterval(15); // 15秒

此外还可以通过 getMaxlnactivelnterval()方法来查看当前Session对象的最大不活动时间

  • 立刻失效session. invalidate();
  • 关闭浏览器失效,从前面的JESSION可知道,session的底层依赖cookie实现,并且该cookie的有效时间为关闭浏览器,从而session在浏览器关闭时也相当于失效了(因为没有JSESSION再与之对应)
  • 关闭服务器失效,当关闭服务器时,Session销毁,Session 失效则意味着此次会话结束,数据共享结束

以上就是此小节的所有内容,我们学习了Session在Servlet中整个创建、操作、销毁的生命周期,在下一节中我们将学习Servlet板块的最后一个对象也是最后一个作用域:ServletContext

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx-------- 高性能的 Web服务端 (三) 验证模块 页面配置

一、http设置 1.1 验证模块 需要输入用户名和密码 htpasswd 此命令来自于 httpd-tools 包&#xff0c;如果没有安装 安装一下即可 也可以安装httpd 直接yum install httpd -y 也一样 第一次生成文件htpasswd -c 文件路径 姓名 交互式生成密码 htpasswd -bc 文…

【python】爬取知乎热榜Top50保存到Excel文件中【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 一、导入必要的模块&#xff1a; 这篇博客将介绍如何使用Python编写一个爬虫程序&#xff0c;从斗鱼直播网站上获取图片信息并保存到本地。我们将使用requests模块发送HTTP请求和接收响应&#xff0c;以及os模块处理文件…

R的seurat和python的scanpy对比学习

现在的单细胞分析&#xff0c;往往避免不了scanpy的使用&#xff0c;我们可以通过对比seurat来学习scanpy 今天的格式怎么都改不了。。。手机阅读有点费劲&#xff0c;&#xff0c;推荐电脑阅读。 单细胞数据分析概览 单细胞分析&#xff0c;总流程 python教程 seurat教程 se…

CSP-J 2023 T1 小苹果

文章目录 题目题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题目传送门题解思路总代码 提交结果尾声 题目 题目描述 小 Y 的桌子上放着 n n n 个苹果从左到右排成一列&#xff0c;编号为从 1 1 1 到 n n n。 小苞是小 Y 的好朋友&#xff0c;每天她都会从…

文心一言4.0 VS ChatGPT4.0 图片生成能力大比拼!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

欢迎 Gemma: Google 最新推出开源大语言模型

今天&#xff0c;Google 发布了一系列最新的开放式大型语言模型 —— Gemma&#xff01;Google 正在加强其对开源人工智能的支持&#xff0c;我们也非常有幸能够帮助全力支持这次发布&#xff0c;并与 Hugging Face 生态完美集成。 Gemma 提供两种规模的模型&#xff1a;7B 参数…

BUUCTF crypto做题记录(8)新手向

一、密码学心声 得到信息如下图 背景故事没什么信息&#xff0c;主要看曲谱。大概率不会让我们涉及与音乐有关的内容&#xff0c;题目中也提示说答案是一串字符串&#xff0c;所以我们可以猜测是将曲谱上的数字转化成字符。曲谱中文字提示是用ASCII码进行转换。没有数字8可能是…

PostMan使用自带js库base64编码、sha256摘要、环境变量的使用

目录 1、环境变量的使用2、base64编码、sha256摘要、以及脚本的使用3、脚本代码 在请求调试接口的过程中&#xff0c;因为要使用大量相同的参数&#xff0c;使用变量的方式能很大程度上减轻接口调用的工作量 版本说明&#xff1a;Postman for Windows&#xff0c;Version&#…

【初中生讲机器学习】11. 回归算法中常用的模型评价指标有哪些?here!

创建时间&#xff1a;2024-02-19 最后编辑时间&#xff1a;2024-02-23 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

【C++私房菜】面向对象中的多重继承以及菱形继承

文章目录 一、多重继承1、多重继承概念2、派生类构造函数和析构函数 二、菱形继承和虚继承2、虚继承后的构造函数和析构函数 三、has-a 与 is-a 一、多重继承 1、多重继承概念 **多重继承&#xff08;multiple inheritance&#xff09;**是指从多个直接基类中产生派生类的能力…

flink内存管理,设置思路,oom问题,一文全

flink内存管理 1 内存分配1.1 JVM 进程总内存&#xff08;Total Process Memory&#xff09;1.2 Flink 总内存&#xff08;Total Flink Memory&#xff09;1.3 JVM 堆外内存&#xff08;JVM Off-Heap Memory&#xff09;1.4 JVM 堆内存&#xff08;JVM Heap Memory&#xff09;…

高并发系统实战课个人总结(极客时间)

高并发系统实战课 场景 读多写少 我会以占比最高的“读多写少”系统带你入门&#xff0c;梳理和改造用户中心项目。这类系统的优化工作会聚焦于如何通过缓存分担数据库查询压力&#xff0c;所以我们的学习重点就是做好缓存&#xff0c;包括但不限于数据梳理、做数据缓存、加缓…

axios是如何实现的(源码解析)

1 axios的实例与请求流程 在阅读源码之前&#xff0c;先大概了解一下axios实例的属性和请求整体流程&#xff0c;带着这些概念&#xff0c;阅读源码可以轻松不少&#xff01; 下图是axios实例属性的简图。 可以看到axios的实例上&#xff0c;其实主要就这三个东西&#xff1a…

CLion 2023:专注于C和C++编程的智能IDE mac/win版

JetBrains CLion 2023是一款专为C和C开发者设计的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它集成了许多先进的功能&#xff0c;旨在提高开发效率和生产力。 CLion 2023软件获取 CLion 2023的智能代码编辑器提供了丰富的代码补全和提示功能&#xff0c;使您能够更…

基于Java+小程序点餐系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

FairyGUI × Cocos Creator 3.x 场景切换

前言 前文提要&#xff1a; FariyGUI Cocos Creator 入门 FairyGUI Cocos Creator 3.x 使用方式 个人demo&#xff1a;https://gitcode.net/qq_36286039/fgui_cocos_demo_dust 个人demo可能会更新其他代码&#xff0c;还请读者阅读本文内容&#xff0c;自行理解并实现。 官…

MySql-DQL-聚合函数

目录 聚合函数统计该企业员工数量count&#xff08;字段&#xff09;count&#xff08;常量&#xff09;count&#xff08;*&#xff09; 统计该企业最早入职的员工统计该企业最迟入职的员工统计该企业员工 ID 的平均值统计该企业员工的 ID 之和 聚合函数 之前我们做的查询都是…

uniapp_微信小程序自定义顶部导航栏和右侧胶囊对齐(不对齐来打我)

一、想要的效果 思路首先开启自定义导航栏&#xff0c;取消自带的导航栏&#xff0c;然后计算胶囊的高度和标题对齐 二、成品代码 1、首先再你需要居中的代码添加以下style <view class"header":style"{paddingTop:navBarTop px,height:navBarHeight px,…

Vue的个人笔记

Vue学习小tips ctrl s ----> 运行 alt b <scrip> 链接 <script src"https://cdn.jsdelivr.net/npm/vue2.7.16/dist/vue.js"></script> 插值表达式 指令

力扣hot100题解(python版7-9题)

7、接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,…