板块一 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 {
    @Override
    protected 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 {
    @Override
    protected 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 {
    @Override
    protected 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

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

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

相关文章

ajax 如何从服务器上获取数据?

在Web开发中&#xff0c;AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种常用的技术&#xff0c;用于在不重新加载整个页面的情况下&#xff0c;从服务器获取数据并更新网页的某一部分。使用AJAX&#xff0c;你可以创建异步请求&#xff0c;从而提供更快的…

AI:133-基于深度学习的工业质检自动化

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Git 关于SSH密钥的生成

一&#xff1a;配置ssh 桌面右键鼠标打开 “Git Bash Here” 键入命令&#xff1a;ssh-keygen -t ed25519 -C "自己邮箱 " 接着就一路回车 打开 C:\Users\Administrator.ssh 目录&#xff0c; 复制 id_xxxxx.pub 内容 文件里面则是一些信息&#xff0c;如下 …

Reliable Visualization for Deep Speaker Recognition - 语音可解释性

MOTIVATION OF READING: 语音任务可解释性 Link: http://arxiv.org/abs/2204.03852 Code&#xff1a;http://project.cslt.org/ 1. Overview Motivation of the work: If any of the visualization tools are reliable when applied to speaker recognition, which makes th…

二百二十四、Kettle——曲线实现从Hive插入更新到ClickHouse(分区字段是month或year)

一、目的 对于以month、year为分区字段的数据&#xff0c;不是像day字段分区那样每天增量插入更新即可&#xff0c;而是要以部分字段查询、部分字段更新&#xff0c;但是ClickHouse数据库并不适合更新操作&#xff0c;直接使用Kettle的插入更新控件会导致问题&#xff0c;必须…

数据仓库选型建议

1 数仓分层 1.1 数仓分层的意义 **数据复用&#xff0c;减少重复开发&#xff1a;**规范数据分层&#xff0c;开发一些通用的中间层数据&#xff0c;能够减少极大的重复计算。数据的逐层加工原则&#xff0c;下层包含了上层数据加工所需要的全量数据&#xff0c;这样的加工方…

JVM对象的创建流程与内存分配

对象的创建流程与内存分配 创建流程对象内存分配方式内存分配安全问题对象内存分配流程【重要】:对象怎样才会进入老年代?重点 案例演示:对象分配过程大对象直接进入老年代02-对象内存分配的过程: 创建流程 加载 验证 解析 准备 初始化 使用 写在 对象内存分配方式 内存分配…

Codeforces Round 928 (Div. 4)( F(dfs+小技巧),G(树上dp) )

CF1926F. Vlad and Avoiding X 题意&#xff1a; 给定一个 7 ∗ 7 7*7 7∗7的网格&#xff0c;网格上的点不是黑色就是白色&#xff0c;要求修改最少的点&#xff0c;使得网格中没有X形状的黑色网格。 思路&#xff1a; 首先看到这个数据范围&#xff0c;很容易想到暴搜&#…

openai chatGPT 原理通俗介绍

引言 近年来&#xff0c;随着深度学习技术的不断发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域取得了长足的进步。ChatGPT&#xff08;Generative Pre-trained Transformer&#xff09;作为一种先进的语言生成模型&#xff0c;在各类对话系统和智能助手中得到…

PHP+vue+mysql网络考试系统成绩学习资料系统7wivi

开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 运行环境:phpstudy/wamp/xammp等 随着互联网的发展&#xff0c;教育也迎来了互联网的春天&#xff0c;现代教育更加依托于互联网的应用&a…

php反序列化原理常见的魔术方法

序列化是什么&#xff1f; 要想了解反序列化&#xff0c;就先要知道序列化是什么。下面是是一串序列化数组&#xff1a; a:2:{s:4:"name";s:6:"cike_y";s:3:"age";i:18;}a表示array&#xff08;数组&#xff09;&#xff0c;2表示这个数组有两…

Maxwell - 增量数据同步工具

前言 今天来学习一个新的大数据小工具 Maxwell &#xff0c;它和 Sqoop 很像。Sqoop主要用于在 Hadoop &#xff08;比如 HDFS、Hive、HBase 等&#xff09;和关系型数据库之间进行数据的批量导入和导出&#xff0c;而 Maxwell 则主要用于监控数据库的变化&#xff08;通过监控…

详解AT24CXX驱动开发(linux platform tree - i2c应用)

目录 概述 1 认识AT24Cxx 1.1 AT24CXX的特性 1.2 AT24CXX描述 1.2.1 引脚 1.2.2 容量描述 1.2.3 设备地址 1.3 操作时序 1.3.1 写单个字节时序 1.3.2 写page字节时序 1.3.3 读取当前数据时序 1.3.4 随机读取数据 1.3.5 连续读取多个数据 2 驱动开发 2.1 硬件接口…

爬虫案例|采集某东商品评论信息|API数据接口 python实例

前言&#xff1a; 平常大家都有网上购物的习惯&#xff0c;在商品下面卖的好的产品基本都会有评论&#xff0c;当然也不排除有刷评论的情况&#xff0c;因为评论会影响我们的购物决策。今天主要分享用pythonre正则表达式获取京东商品评论。可以直接采用API接口接入形式大规模采…

【洛谷 P8780】[蓝桥杯 2022 省 B] 刷题统计 题解(贪心算法+模拟+四则运算)

[蓝桥杯 2022 省 B] 刷题统计 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a a a 道题目&#xff0c;周六和周日每天做 b b b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n n n 题? 输入格式 输入一…

python使用openpyxl添加图片到excel文件中

文章目录 openpyxl添加图片方法示例程序 openpyxl添加图片方法 图片只能保存在某个sheet页面中&#xff0c;因此首先打开sheet页面&#xff1a; openpyxl.load_workbook("测试excel.xlsx")然后创建一个图片&#xff1a; input_sheet excel_workbook["Sheet1…

java—泛型编程

文章目录 什么是泛型为什么需要泛型 泛型的使用泛型的上界 泛型方法的使用引出泛型方法 泛型是如何编译的擦除机制 什么是泛型 首先什么是泛型呢&#xff1f;从字面上我们可以理解为广泛的类型&#xff0c;有一定c基础的程序猿们应该了解&#xff0c;java中的泛型其实就是c的模…

小米14 ULTRA:重新定义手机摄影的新篇章

引言 随着科技的飞速发展&#xff0c;智能手机已经不仅仅是一个通讯工具&#xff0c;它更是我们生活中的一位全能伙伴。作为科技领域的佼佼者&#xff0c;小米公司再次引领潮流&#xff0c;推出了全新旗舰手机——小米14 ULTRA。这款手机不仅在性能上进行了全面升级&am…

UE5 C++ 静态加载资源和类

一.上篇文章创建组件并绑定之后 在Actor中加载初始化了组件&#xff0c;现在在组件中赋值。使用static ConstructorHelpers::FObjectFinder<T>TempName(TEXT("Copy Reference"))&#xff1b;再用TempName.Object //静态加载资源static ConstructorHelpers::FOb…

Java HashMap源码剖析

字面上看&#xff0c;HashMap由Hash和Map两个单词组成&#xff0c;Map表示映射关系&#xff0c;是一个接口&#xff0c;实现Map接口有多种方式&#xff0c;HashMap实现的方式利用了Hash。本文先分析Map接口&#xff0c;接着分析HashMap实现原理&#xff0c;最后总结分析HashMap…