javaweb之会话管理

Cookie:

1. Cookie 的定义

  • Cookie 是存储在用户浏览器中的小块数据,通常由服务器发送并存储,以便在用户浏览器和服务器之间保持会话状态。
  • 每次用户发送请求时,浏览器都会自动附带相应的 Cookie,允许服务器辨识用户。

2. Cookie 的用途

  • 保持会话状态:用于存储用户登录状态或购物车等会话信息。
  • 个性化设置:保存用户的偏好设置,比如语言选择、字体大小等。
  • 跟踪用户行为:例如分析用户访问网站的行为,以进行个性化推荐。

3. Cookie 的分类

  • 会话 Cookie(Session Cookie):在浏览器关闭后失效,通常用于临时数据存储。
  • 持久 Cookie(Persistent Cookie):设置了过期时间,在过期前即使关闭浏览器也不会被删除。
默认情况下 Cookie 的有效期是一次会话范围内,我们可以通过 Cookie setMaxAge() 方法让 Cookie 持久化保存到浏览器上。
cookie.setMaxAge(int expiry) 参数单位是秒,表示 cookie 的持久化时间,如果设置参数为 0 ,表示将 浏览器中保存的该cookie 删除。

 session:

HttpSession的概述:

HttpSession是一种保留更多信息在服务端的一种技术 服务器会为每一个客户端开辟一块内存空
间,即session对象.。客户端在发送请求时,都可以使用自己的session。这样服务端就可以通过
session来记录某个客户端的状态了。

  • 服务端在为客户端创建session时,会同时将session对象的id,即JSESSIONIDCookie的形式放入响 应对象;  
  • 后端创建完session后,客户端会收到一个特殊的Cookie,叫做JSESSIONID
  • 客户端下一次请求时携带JSESSIONID,后端收到后,根据JSESSIONID找到对应的session对象;
  • 通过该机制,服务端通过session就可以存储一些专门针对某个客户端的信息了;
  • session也是域对象(后续详细讲解)

应用场景:

  1.  记录用户的登录状态: 用户登录后,将用户的账号等敏感信息存入session
  2.  记录用户操作的历史: 如记录用户的访问痕迹,用户的购物车信息等临时性的信息;

测试:  

注意!!!

生成web项目后,一定要删去index.jsp;原因:里面有内置的session对象,会干扰

 servlet1:

package servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;import java.io.IOException;
@WebServlet("/servlet1")
public class servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 接收请求中的username参数String username = req.getParameter("username");// 获得session对象HttpSession session = req.getSession();// 改变session的失效时间session.setMaxInactiveInterval(120);System.out.println(session.getId());System.out.println(session.isNew());//判断请求中有没有一个特殊的cookie JSESSIONID 值*****//1有//根据 JSESSIONID找对应的session对象// 找到了// 返回之前的session// 没有找到// 创建一个新的session返回,并且向response对象中存放一个SESSIONID  的cookie// 2 没有// 创建一个新的session返回,并且向response对象中存放一个SESSIONID 的cookie// 将username存入sessionsession.setAttribute("username",username);// 客户端响应信息resp.setContentType("text/html;charset = UTF-8");resp.getWriter().write("成功");}
}

servlet2:

package servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;import java.io.IOException;
@WebServlet("/servlet1")
public class servlet1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 接收请求中的username参数String username = req.getParameter("username");// 获得session对象HttpSession session = req.getSession();// 改变session的失效时间session.setMaxInactiveInterval(120);System.out.println(session.getId());System.out.println(session.isNew());//判断请求中有没有一个特殊的cookie JSESSIONID 值*****//1有//根据 JSESSIONID找对应的session对象// 找到了// 返回之前的session// 没有找到// 创建一个新的session返回,并且向response对象中存放一个SESSIONID  的cookie// 2 没有// 创建一个新的session返回,并且向response对象中存放一个SESSIONID 的cookie// 将username存入sessionsession.setAttribute("username",username);// 客户端响应信息resp.setContentType("text/html;charset = UTF-8");resp.getWriter().write("成功");}
}

getSession方法的处理逻辑:

  • 初次请求

    • 浏览器向服务器发起第一次请求(请求报文)。
    • 服务器端处理该请求,创建一个新的Session,并将Session的ID(如JSESSIONID)保存在Cookie中,作为响应的一部分(响应报文),发送给浏览器。
  • 浏览器存储Cookie

    • 浏览器接收到服务器的响应,将Cookie中的JSESSIONID存储下来。
  • 再次请求

    • 当浏览器再次发起请求时,会自动携带之前存储的Cookie(包含JSESSIONID)。
    • 服务器接收到请求后,读取该Cookie中的Session ID(如JSESSIONID),找到与之对应的Session,获取其中存储的键值对数据,处理请求。
  • 响应返回

    • 服务器处理完请求后,再次返回响应报文,浏览器接收并继续进行后续的操作。

总结

  • 每次请求时,浏览器都会携带上次存储的Cookie来标识当前用户的会话。
  • 服务器通过读取Cookie中的JSESSIONID,找到对应的Session,进而保持会话数据的连续性。

 HttpSession时效性:

为什么要设置session的时效?

  • 用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存 迟早要被耗尽;
  • 客户端关闭行为无法被服务端直接侦测,或者客户端较长时间不操作也经常出现,类似这些的情 况,就需要对session的时限进行设置了(例如很久没登录过的哔哩哔哩要重新登录)
默认的 session 最大闲置时间 ( 两次使用同一个 session 中的间隔时间 ) Tomcat/conf/web.xml 配置为 30分钟。

 如何看TomCat里面设置的session时效呢?

 注意!!!!

这里不再是30s了,在Tomcat的配置文件中,<session-timeout> 的单位是分钟。因此,在图中设置的<session-timeout>30</session-timeout>表示Session超时时间为30分钟,服务器将自动使该Session失效。

如何自己设置时间?

我们可以自己在当前项目的web.xml对最大闲置时间进行重新设定。

也可以通过HttpSessionAPI 对最大闲置时间进行设定。 

三大域对象: 

域对象:一些用于存储数据和传递数据的对象。传递数据不同的范围,我们称之为不同的域。不
同的域对象代表不同的域,共享数据的范围也不同
web 项目中,我们一定要熟练使用的域对象分别是 :请求域、会话域、应用域;
  • 请求域对象是HttpServletRequest ,传递数据的范围是一次请求之内及请求转发;
  • 会话域对象是HttpSession,传递数据的范围是一次会话之内,可以跨多个请求;
  • 应用域对象是ServletContext,传递数据的范围是本应用之内,可以跨多个会话;

1. 请求域(Request Scope)

  • 对象: HttpServletRequest
  • 作用范围: 仅限于一次HTTP请求。在同一个请求过程中,数据可以在Servlet、JSP或其他组件之间共享。
获取不到数据的情况:
  • 请求已经结束: 请求域中的数据只在当前请求有效。一旦请求结束(如重定向、返回响应给客户端后),请求对象会销毁,数据将不可访问。(当然可以进行请求转发,可以获取数据)
  • 跨请求: 如果想在一次请求中设置数据,然后在下一次请求中获取(如重定向或从不同的页面发起请求),由于请求已经变化,无法获取之前的请求域数据。

2. 会话域(Session Scope)

  • 对象: HttpSession
  • 作用范围: 作用于一个用户会话期间。只要用户会话没有过期或销毁,数据可以在多个请求之间共享。
获取不到数据的情况:
  • Session过期或销毁: 如果用户长时间没有操作(超过了Session的超时时间,默认30分钟),Session会被服务器销毁,之后再尝试访问会话域中的数据将获取不到。
  • Session手动销毁: 通过调用session.invalidate(),会立即销毁会话,所有的会话域数据将被清除。
  • 新建Session: 如果在一个新的请求中,用户没有携带之前的Session(如关闭浏览器后再访问),服务器会创建一个新的Session,之前的会话域数据将获取不到。又比如两个浏览器不能共享数据,清空浏览器的历史记录

3. 应用域(Application Scope)

  • 对象: ServletContext
  • 作用范围: 作用于整个Web应用程序的生命周期。数据可以在整个应用程序范围内(跨用户和跨请求)共享,直到服务器停止或Web应用重新部署。
获取不到数据的情况:
  • 应用程序重启或重新部署: 服务器重启或Web应用重新部署时,应用域中的数据将会被销毁,再次访问时获取不到原有的数据。
  • 数据未设置: 如果程序没有显式地通过ServletContext设置数据,访问时自然获取不到。
  • 应用域数据手动移除: 如果调用removeAttribute()方法手动移除了某个数据项,也会导致后续无法获取该数据。

 测试 API:

servletA:

package servlet;import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;import java.io.IOException;@WebServlet("/servletA")
public class servletA extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 向请求域存放数据req.setAttribute("request","requestMessage");// 向会话域存放数据HttpSession session = req.getSession();session.setAttribute("session","sessionMessage");// 向应用域存放数据ServletContext servletContext = session.getServletContext();servletContext.setAttribute("application","applicationMessage");// 获取请求域String reqMse = (String) req.getAttribute("request");System.out.println("请求域" + reqMse);//        // 请求转发
//        req.getRequestDispatcher("/servletB").forward(req,resp);}}

servletB:

package servlet;import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;import java.io.IOException;
@WebServlet("/servletB")
public class servletB extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取请求域的数据String reqMse = (String) req.getAttribute("request");System.out.println("请求域" + reqMse);// 获取会话域的数据 换一个浏览器就获取不到数据了HttpSession session = req.getSession();String SessionMse = (String) session.getAttribute("session");System.out.println("会话域" + SessionMse);// 获取应用域的数据ServletContext servletContext =  session.getServletContext();String AppMse = (String) servletContext.getAttribute("application");System.out.println("应用域" + AppMse);}
}

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

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

相关文章

JSR 303学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

低代码可视化-UniApp二维码可视化-代码生成器

市面上提供了各种各样的二维码组件&#xff0c;做了一简单的uniapp二维码组件&#xff0c;二维码实现依赖davidshimjs/qrcodejs。 组件特点 跨浏览器支持&#xff1a;利用Canvas元素实现二维码的跨浏览器兼容性&#xff0c;兼容微信小程序、h5、app。 无依赖性&#xff1a;QR…

基于SpringBoot的新冠检测信息管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 国内外在该方向的研究现状及分析 新型冠状病毒肺炎疫情发生以来&#xff0c;中国政府采取积极的防控策略和措施&#xff0c;经过两个多月的不懈努力&#xff0c;有效控制了新发病例的増长&#xff0c;本地传播已经趋于完全控制…

JavaWeb图书借阅系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…

Elasticsearch学习笔记(1)

初识 Elasticsearch 认识和安装 Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术&#xff0c;属于 Elastic 技术栈的一部分。完整的技术栈包括&#xff1a; Elasticsearch&#xff1a;用于数据存储、计算和搜索。Logstash/Beats&#xff1a;用于数据收集。Kib…

运放模块的选型参数

增益带宽积-----尤其重要&#xff1a; GWB 增益*带宽 压摆率&#xff1a; 高带宽的运放一般都是电流型运放&#xff1a; 注意压摆率计算公式里面的Vopp参数是放大后的电压最大值&#xff1a; 参数&#xff0c;布局一定参考数据手册&#xff01;&#xff01;&#xff01;&…

关于AI副业,能说的都说了(最核心3大赛道、机会、方向)

AI&#xff0c;是生产力工具~ AI&#xff0c;也是焦虑和痛点 一直有小伙伴在问AI副业的事儿&#xff0c;之前也分享过很多。 但是&#xff0c;很多人对AI于副业的作用&#xff0c;过于表面和形式&#xff0c;所以&#xff0c;狂金来叨叨一下最核心的3大赛道&#xff0c;希望…

本地部署ollama大模型

方案一 1. 安装 Docker Ollama 大模型通常是通过 Docker 来运行的&#xff0c;因此首先需要确保本地已经安装了 Docker。如果还没有安装 Docker&#xff0c;可以参考以下安装步骤&#xff1a; Mac 用户&#xff1a; 前往 Docker 官网 下载并安装 Docker Desktop。安装完成后&…

【C语言】动态内存管理:malloc、calloc、realloc、free

本篇介绍一下C语言中的malloc/calloc/realloc。 使用这些函数需要包含头文件<stdlib.h>。malloc/calloc/realloc申请的空间都是 堆区的。 1.malloc和free 1.1 malloc C语言提供了一个动态内存开辟的函数malloc&#xff0c;函数原型如下。 void* malloc(size_t size);…

确保架构与业务一致性和合规性的成功转型之路:理论与实践的全面解读

架构与业务一致性在数字化转型中的重要性 在数字化转型的过程中&#xff0c;企业架构与业务的一致性是确保技术变革能够真正推动业务发展的关键因素之一。企业架构不仅要支持业务需求&#xff0c;还需要确保与行业标准、法律法规的合规性。通过将理论转化为实践&#xff0c;企…

渗透测试--文件上传常用绕过方式

文件上传常用绕过方式 1.前端代码&#xff0c;限制只允许上传图片。修改png为php即可绕过前端校验。 2.后端校验Content-Type 校验文件格式 前端修改&#xff0c;抓取上传数据包&#xff0c;并且修改 Content-Type 3.服务端检测&#xff08;目录路径检测&#xff09; 对目…

无人机专业实操重要性凸显,组装、调试、改装技术详解

无人机专业的实操性在当今技术飞速发展的背景下显得尤为重要&#xff0c;这不仅体现在无人机的日常应用上&#xff0c;还贯穿于无人机的组装、调试及改装等关键环节中。以下是对这些技术环节的详细解析&#xff1a; 一、无人机组装技术 无人机的组装是无人机技术的基础&#x…

mysql8.0安装后没有my.ini

今天安装mysql后想改一下配置文件看了一下安装路径 C:\Program Files\MySQL\MySQL Server 8.0 发现根本没有这个文件查看隐藏文件也没用查了之后才知道换地方了和原来的5.7不一样 新地址是C:\ProgramData\MySQL\MySQL Server 8.0 文件也是隐藏的记得改一下配置

Json-Rpc框架(Muduo库快速上手)

阅读导航 引言一、Muduo库简介二、Muduo库常见接口1. TcpServer类基础介绍2. EventLoop类基础介绍3. TcpConnection类基础介绍4. TcpClient类基础介绍5. Buffer类基础介绍 三、Muduo库使用示例⭕英译汉服务器⭕英译汉客户端 引言 在上一篇文章中&#xff0c;我们简要介绍了在项…

SpringBoot教程(安装篇) | Docker Desktop的安装(Windows下的Docker环境)

SpringBoot教程&#xff08;安装篇&#xff09; | Docker Desktop的安装&#xff08;Windows下的Docker环境&#xff09; 前言如何安装Docker Desktop资源下载安装启动&#xff08;重点&#xff09;加入汉化包 设置加速镜像 前言 如果你在 Windows 上&#xff0c;确保 Docker …

Java实现找色和找图功能

某天&#xff0c;张三接到一个任务需求&#xff0c;将一个Excel表格里面的员工信息&#xff0c;录入到员工系统里面&#xff0c;由于数据量非常大&#xff0c;操作起来巨慢。经过一段时间的操作和观察&#xff0c;他发现这种操作&#xff0c;非常有规律&#xff0c;基本就是一些…

huggingface的transformers与datatsets的安装与使用

目录 1.安装 2.分词 2.1tokenizer.encode&#xff08;&#xff09; 2.2tokenizer.encode_plus &#xff08;&#xff09; 2.3tokenizer.batch_encode_plus&#xff08;&#xff09; 3.添加新词或特殊字符 3.1tokenizer.add_tokens&#xff08;&#xff09; 3.2 token…

第L4周:机器学习-KNN总结-分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 概念&#xff1a; 在第L4周&#xff1a;机器学习-K-邻近算法模型&#xff08;KNN&#xff09;-CSDN博客中学习了KNN的基本概念&#xff0c;本次主要加深印象&a…

锐捷 NBR 1300G路由器 越权CLI命令执行漏洞

漏洞描述 锐捷NBR 1300G路由器 越权CLI命令执行漏洞&#xff0c;guest账户可以越权获取管理员账号密码 漏洞复现 FOFA title"锐捷网络 --NBR路由器--登录界面" 请求包 POST /WEB_VMS/LEVEL15/ HTTP/1.1 Host: Connection: keep-alive Content-Length: 73 Autho…

硬件设计-噪声的学习

目录 LDO 噪声和 PSRR ​编辑 噪声类型 数据表中的噪声规格 哪种规格适合您的应用 如何降低 LDO 噪声&#xff1f; LDO 噪声的影响 LDO 噪声和 PSRR 低压差线性稳压器 (LDO) 为调节由较高电压输入产生的输出电压提供了一种简单方法。虽然操作简单&#xff0c;但其自生噪…