Servlet--Session原理及API的使用

JavaWeb——Servlet(全网最详细教程) JavaWeb技术之Servlet 阅读详情
Session概述

当人们去医院就诊时,就诊病人需要办理医院的就诊卡,该卡上只有卡号,而没有其它信息。但病人每次去该医院就诊时,只要出示就诊卡,医务人员便可根据卡号查询到病人的就诊信息。
Session技术就好比医院发放给病人的就医卡和医院为每个病人保留病例档案的过程。
当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于兵力档案,ID就相当于就诊卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。

需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的。

示例:以购物网站为例,通过下图描述Session保存用户信息的原理:
在这里插入图片描述
在上去中,用户甲和乙都调用buyServlet将商品添加到购物车,调用payServlet进行商品结算。由于甲和乙购买商品的过程类似,在此,以用户甲为例进行详细说明。当用户访问购物网站时,服务器为甲创建了一个Session对象(相当于购物车)。当甲将Nokia手机添加到购物车时,Nokia手机的信息便存放到了Session对象中。同时,服务器将Session对象的ID属性以Cookie(Set-Cookie:JSESSIONID=111)的形式返回给甲的浏览器。当甲完成购物进行结账时,需要向服务器发送结账请求,这时,浏览器自动在请求消息头中将Cookie(Cookie:JSESSIONID=111)信息回送给服务器,服务器根据ID属性找到为用户甲所创建的Session对象,并将Session对象中所存放的Nokia手机信息取出进行结算。

为什么要使用会话
  • 使用Servlet生成验证码时,我们需要在服务器记录一份生成的随机字符,当用户提交填写的数据时,将用户输入的数据和服务器缓存的数据进行对比。
  • 将随机字符串保存在ServletContext中或者request中是否可以?
    • 将数据存放到ServletContext,多个用户共享一个验证码。
      在这里插入图片描述
    • 将数据存放到request作用域,多次请求不能共享数据。
      在这里插入图片描述 - 将数据保存到ServletContext和request中是存在问题的,那么就需要使用会话技术保存用户的私有信息。
为何有了Cookie还需要Session
  • Cookie是有大小和个数的限制的Session存到服务器端的技术,没有大小和个数的限制
  • Cookie相对于Session来讲不安全
使用Session

Session是与每个请求消息紧密相关的,为此i,HttpServletRequest定义了用于获取session对象的getSession()方法,该方法有两种重载形式,具体如下。

public HttpSession getSession(boolean create)
public HttpSession getSession()

上面重载的两个方法都用于返回与当前请求相关的HttpSession对象。不同的是,第一个getSession()方法根据传递的参数来判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HtttpSession对象,否则不创建新的HttpSession对象,而是返回null。
第二个getSession()方法则相当于第一个方法参数为true时的情况,在相关的HttpSession对象不存在时总是创建新的HttpSession对象。

要想使用HttpSession对象管理会话数据,不仅需要获取到HttpSession对象,还需要了解HttpSession对象的相关方法。HttpSesseion接口中定义的操作会话数据的常用方法如下表:

Session API
方法声明功能描述
String getId()用于返回与当前HttpSession对象关联的会话标识号
long getCreationTime()返回Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间时间差的毫秒形式表示
long getLastAccessedTime()返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式
void setMaxInactiveInterval(int interval)用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔
boolean isNew()判断当前HttpSession对象是否是新创建的
void invalidate()用于强制使Session对象无效
ServletContext getServletContext()用于返回当前HttpSession对象所属于的WEB应用程序对象,即代表当前WEB应用程序的ServletContext对象
void setAttribute(String name, Object value)用于将一个对象与一个名称关联后存储到当前的HttpSession对象中
String getAttribute()用于从当前HttpSession对象中返回指定名称的属性对象
void removeAttribute(String name)用于从当前HttpSession对象中删除指定名称的属性
实例

使用HttpSession对象获取Session会话创建时间和最后访问时间。如果不存在session会话,我们将通过请求创建一个新的session会话。

package pers.zhang.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author zhang
 * @date 2019/9/19 - 11:29
 */
public class SessionServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //如果不存在Session会话,则创建一个session对象
        HttpSession session = request.getSession(true);
        //获取session创建时间
        Date createTime = new Date(session.getCreationTime());
        //获取该网页的最后一次访问时间
        Date lastAccessTime = new Date(session.getLastAccessedTime());

        //设置日期输出的格式
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        String title = "Servlet Session";
        Integer visitCount = new Integer(0);
        String visitCountKey = new String("visitCount");
        String userIDKey = new String("userID");
        String userID = new String("zhang");
        if(session.getAttribute(visitCountKey) == null){
            session.setAttribute(visitCountKey, new Integer(0));
        }

        //检查网页上是否有新的访问者
        if(session.isNew()){
            title = "Servlet Session";
            session.setAttribute(userIDKey, userID);
        }else{
            visitCount = (Integer) session.getAttribute(visitCountKey);
            visitCount = visitCount + 1;
            userID = (String) session.getAttribute(userIDKey);
        }
        session.setAttribute(visitCountKey, visitCount);

        // 设置响应内容类型
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String docType = "<!DOCTYPE html>\n";
        out.println(docType +
                "<html>\n" +
                "<head><title>" + title + "</title></head>\n" +
                "<body bgcolor=\"#f0f0f0\">\n" +
                "<h1 align=\"center\">" + title + "</h1>\n" +
                "<h2 align=\"center\">Session 信息</h2>\n" +
                "<table border=\"1\" align=\"center\">\n" +
                "<tr bgcolor=\"#949494\">\n" +
                "  <th>Session 信息</th><th>值</th></tr>\n" +
                "<tr>\n" +
                "  <td>id</td>\n" +
                "  <td>" + session.getId() + "</td></tr>\n" +
                "<tr>\n" +
                "  <td>创建时间</td>\n" +
                "  <td>" +  df.format(createTime) +
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>最后访问时间</td>\n" +
                "  <td>" + df.format(lastAccessTime) +
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>用户 ID</td>\n" +
                "  <td>" + userID +
                "  </td></tr>\n" +
                "<tr>\n" +
                "  <td>访问统计:</td>\n" +
                "  <td>" + visitCount + "</td></tr>\n" +
                "</table>\n" +
                "</body></html>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

浏览器第一次访问,页面显示:
在这里插入图片描述
第二次访问:
在这里插入图片描述

GeoServer改造Springboot源码一(公共部分) 今天开始开启关于GeoServer的一个全新系列,主要是把改造Springboot后的详细代码粘贴出来,此文应配合《》系列共同阅读,按照前系列的时间顺序结合此系列的源码展示可以快速构建GeoServer功能的二次封装的后端系统。 阅读详情

相关推荐

camera 知识速查

本文总结了Camera开发中的常见问题排查方法和关键技术点。主要内容包括:I2C/MIPI不通的排查步骤、时序问题分析方法、Sensor/AF/Flash/PDAF的Bring Up流程、OTP调试方法、PDAF原理及调试、CTS/ITS问题解决思路、AE震荡解决方案、Systrace性能分析方法、Flicker产生原理、Tombstone问题定位等。还涉及V4L2框架解析、问题定位分层方法、Sensor Setting注意事项、时钟信号概念、第三方应用卡顿排查、大光圈概念、Monkey测试方法。

qq_41665131的博客 783

Servlet API中的会话管理操作(基于Cookie与Session)

本篇文章将介绍Servlet中的会话管理操作,前面在介绍HTTP的时候,我们已经说了Cookie与Session的基本原理,Cookie相当于就诊卡,就诊卡一刷得到的信息就相当于Session,Servlet对Cookie与Session有着很好的支持,可以实现会话的管理操作。............

未见花闻的博客 1034

.NET MAUI 第13讲 深入探索 .NET MAUI Essentials:让应用感知设备与环境,打造智能体验

摘要:本文介绍了.NET MAUI Essentials库如何赋能移动应用感知设备环境的能力。文章详细讲解了设备信息获取(DeviceInfo)、网络状态监测(Connectivity)、地理位置服务(Geolocation)、地图集成(Map)以及传感器(Accelerometer等)等核心功能的使用方法,并提供了完整的代码示例。通过一个综合练习,展示了如何构建设备信息仪表板,实时显示设备参数和网络状态,并实现位置获取与地图导航功能。这些跨平台API能显著提升应用智能化和用户体验,同时保持代码简洁高效。

AlphaNil的博客 1087

【java学习笔记】基于Cookie的Session会话技术(介绍+工作原理+流程分析+常见API)

目录session介绍session工作原理实现流程分析Session常见的API实现代码 session介绍 先前的博客中已经介绍了Cookie会话技术,在本文章中将介绍总结Session技术。 Session技术是以Cookie技术为基础的,这也是这篇文章的标题,只要理解了它们之间的联系和区别,你就对B/S通信能有个大致的了解。 和Cookie相比 session 是一种更安全的存储对象。Cookie的信息存储于客户端,用户可以随时查看和修改,而Session信息存储于服务器,用户不可见。 Co

zbcwmq的博客 1983

UWB灵犀遥控器方案介绍

UWB灵犀指向遥控器的技术原理和方案介绍

xiongdauwb的博客 3899

避坑指南:ZYNQ MPSOC QSPI固化时MT25QU256闪存的特殊配置

本文针对Xilinx ZYNQ UltraScale+ MPSoC平台,详细解析了使用Vitis工具将BOOT.bin固化至Micron MT25QU256ABA QSPI NOR Flash时的特殊配置与避坑指南。重点阐述了Init文件的真实作用、电压与频率的精确匹配策略,以及针对该闪存型号的初始化序列,帮助工程师解决烧录失败、启动异常等常见问题,确保系统可靠启动。

weixin_29175469的博客 270

Servlet第六篇【Session介绍、API、生命周期、应用】

什么是Session Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种的形式记录在服务器,这就是Session 如果说Cookie是检查用户身上的”通行证“来确认用户的身份,那么Session就是通过检查服务器上的”客户明细表“来确认用户的身份的。Session相当...

3y 665

【STM32】STM32F407实现简单的Modbus协议

1.ModBus协议简介 MODBUS协议是一种串行通信协议,由Modicon公司(施耐德公司前身)发表,由于其公开发表且无版权要求,易于部署和维护,在工业界广泛应用。MODBUS采用主从通信(Master/Slave),MODBUS有三种报文格式:ASCII、RTU、TCP,本文主要讨论RTU。 如下图所示,串行通信上的MODBUS协议主要由地址,功能码,数据,CRC校验四部分数据帧构成。主机和从机的串行通信设备要求一致,参数要求一致,即假设使用串口,主从机波特率,奇偶校验...

BadBoyHolly的博客 8185

JavaEE入门之Servlet——HttpSession对象及Servlet注解开发

HttpSession对象介绍及使用、Servlet注解开发

qq_52999405的博客 553

【Pytorch】DCGAN实战(三):二次元动漫头像生成

文章目录1.实现效果2.环境配置2.1Python2.2Pytorch、CUDA2.3Python IDE3.具体实现3.1数据预处理(data.py)(1)导入包(2)定义数据类3.2模型Generator,Discriminator,权重初始化(model.py)(1)导入包(2)Generator(3)Discriminator(4)权重初始化3.3网络训练(net.py)(1)导入包(2)创建类3.4 主函数(main.py)(1)导入文件(2)定义超参数(3)实例化(4)进行训练4.训练过程4.1

qq_44031210的博客 4917

别再手动改文献了!手把手教你定制Mendeley的GB/T 7714-2005引用格式(附常见问题修复)

本文详细指导如何定制Mendeley的GB/T 7714-2005引用格式,解决科研文献管理中的常见问题。通过深度解析Mendeley样式编辑器,精准控制作者显示规则、出版社信息精简及期刊页码处理,实现参考文献一键合规。附常见问题修复和实战调试方法,大幅提升学术写作效率。

weixin_26833503的博客 374

Hibernate--Session对象及常用API、Transaction对象及API详解

Session: Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是**Session是非线程安全的。**同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象成为用...

吴声子夜歌的博客 1390

INFFUS 2025 | DDBFusion:基于双重分解和贝塞尔曲线的统一图像分解与融合框架

现有的图像融合算法大多集中于网络架构和损失函数的设计,采用统一的特征提取策略,却忽略了冗余信息和有效信息的划分。然而,对于互补信息而言,统一的特征提取器可能并不适用。因此,本文提出了一种基于贝塞尔曲线图像增强和分层分解的统一图像融合算法,并构建了一个自监督学习任务来学习有意义的信息。其中,贝塞尔曲线旨在模拟不同的图像特征,并构建特殊的自监督学习样本,因此作者的方法不需要特定任务的数据,并且可以在公共自然图像数据集上轻松进行训练。同时,作者的双重分解自监督训练方法可以为模型赋予冗余信息过滤能力。

小白学视觉 308

Servlet(Cookie和Session)

🐲 1. Cookie 的工作流程 🐲 2. Servlet中操作 Cookie 和 Session 的api 🐲 3. 案例1: 模拟登录 🐲 4. 上传文件 🐲 5. 案例2: 上传文件

m0_58761900的博客 1928

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Tomcat运行流程、Servlet运行原理以及常用API

Tomcat运行流程、Servlet运行原理以及常用API

冯同学的博客 2234

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Cookie和Session的工作流程以及Servlet中与之相关的API

Cookie和Session的工作流程以及Servlet中与之相关的API

m0_67683346的博客 712

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

16.Servlet [一篇通]

一篇文章彻底讲解Servlet中大大小小的全部知识,通过此篇文章你可以学到如何从0创建到发布一个servlet小程序,如何使用idea自动化配置tomcat,不再需要手动一下一下的点击配置tomcat,在网页中出现各种错误是什么意思,知道了意思之后我们该怎么去解决他们呢,以及servlet中相关API的解析和讲解,最后作者附上了本文章所以代码,大家可以按需查找哦!!!

xinhang10的博客 2649

Session超时的三种配置

在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的。Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了。   设置Session超时时间方式: 方式一:  在web.xml中

逍遥快活一书生的博客 4565

SpringMVC获取Servlet原生的api

/** * servlet原生的api * @param request * @param response * @return */ @RequestMapping("/testServlet") public String testServlet(HttpServletRequest request, HttpServletR...

weixin_41605945的博客 213

Session工作原理(详解)

1.概述 存在服务器的一种用来存放用户数据的类哈希表结构,当浏览器第一次发送请求的时候服务器会生成一个hashtable和一个sessionid,sessionid来唯一标识这个hashtable,响应的时候会通过一个响应头set-cookie返回给浏览器,浏览器再将这个sessionid存储在一个名为JESSIONID的cookie中。 接着浏览器在发送第二次请求时,就会带上这个cookie,这个cookie会存储sessionid一并发送给了一个服务,服务器再从请求中提取出...

handsome1_的博客 7008

java servlet api总结_JavaWeb编程基础组件,Servlet核心用法总结

一、Servlet简介Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。使用Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。二、实现方式1、继承HttpServlet继承自 GenericServlet. 遵守 HTTP协议实现,以设计模式的角度看,HttpServlet担任抽象模板角...

weixin_39930748的博客 247

8.Session域(超链接的使用)

1、session是什么? 会话技术,保存共享的会话数据至服务器端 2.session和cookie的区别; cookie:服务器创建,保存在浏览器 session:服务器创建,保存在服务器 3.session原理: 浏览器访问服务器,服务器创建session对象和ID属性, session对象存储在服务器,ID属性带回浏览器(用cookie带回去),浏览器再次访问服务器,就带着ID过来,服务器选择相应的session对象进行“服务” session借助于cookie实现 4、sessior的API 获取

YANG_xiao_QI的博客 778

Session超时设置

Session是由浏览器和服务器之间维护的。Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了。设置Session超时时间方式:1、方式一 在web.xml中设置session-config如下: &lt;session-config&gt; ...

Hedwig的博客 4443

使用Tomcat搭建一个Servlet项目

Tomcat maven 使用 创建maven项目 管理依赖 实践 使用总结 GET,POST请求应用场景 Servlet运行原理 Tomcat伪代码 Tomcat初始化 Tomcat处理请求 Servlet的关键API HTTPServlet HttpServletRequest和HttpServletResponse 例子1: 例子2: body格式 请求body格式 响应body格式 Cookie和Session HttpServletRequest类中的相关方法 HttpServletRespons

weixin_46429649的博客 2667

session

文章目录什么是session获取方法实现原理CookieURL重写session生命周期session其他API 参考:session 什么是session 概念 HttpSession是一个Java类,用于跟踪会话,一个浏览器从首次访问服务器到关闭浏览器,独自占有一个session。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其...

Java修理工 971

Javaweb——会话技术(Cookie、Session)讲解

Response 对象 一、Response 对象的概述 B/S 结构的软件,可以通过浏览器访问服务器; 二、Response 对象的 API 1. 关于响应行的方法 setStatus(int sc) 设置响应的状态码; 2. 关于响应头的方法 setHeader(String name, String value) set 开头的方法:一个 key 对应一个 value情况; addHeader(String name, String value) Add 开头的方法:一个 key 对应多个

Zzz5270的博客 1059
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值