javaweb之会话管理

news2024/11/17 6:28:56

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 {
    @Override
    protected 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存入session
        session.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 {
    @Override
    protected 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存入session
        session.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 {
    @Override
    protected 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 {
    @Override
    protected 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.coloradmin.cn/o/2175239.html

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

相关文章

58 深层循环神经网络_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录深度循环神经网络1. 模型复杂性增加2. 训练数据不足3. 梯度消失和爆炸4. 正则化不足5. 特征冗余总结 函数依赖关系简洁实现训练与预测小结练习 深度循环神经网络 &#x1f3f7;sec_deep_rnn 到目前为止&#xff0c;我们只讨论了具有一个单…

基于大数据的亚健康人群数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

在vsCode中将某个字符替换成换行符并且换行展示

将下面一行字符串中的“,”替换成换行符并且换行展示。 CTRLF键检索&#xff0c;查找和替换内容根据如下图输入即可。 点击全部替换后得到如下结果&#xff1a;

图文深入理解Oracle Network配置管理(二)

本篇图文深入介绍Oracle Network配置管理。 Oracle网络配置的目的 为了方便对Oracle 数据库进行管理&#xff0c;一般以下情况应该对Oracle进行网络配置。 • 在客户端对服务器端数据库进行管理&#xff08;网络客户端管理&#xff09; • 在一台服务器上管理多个数据库&…

性能测试学习1:性能测试的理论与目的,与功能测试的区别

一.什么是性能&#xff1f; 1&#xff09;性能&#xff1a;就是软件质量属性中的“效率”特性 2&#xff09;效率特性: ①时间特性&#xff1a;表示系统处理用户请求的响应时间【通俗来说&#xff0c;就是使用系统是否流畅】 ②资源特性&#xff1a;表示系统运行过程中&…

青动CRM-仓储云V1.1.2

多平台(微信公众号(高级授权)、微信小程序(高级授权)、H5网页(高级授权)、Android-App(高级授权)、iOS-App(高级授权))仓库管理系统&#xff0c;拥有强大的表单设计、多角色员工权限、出入库管理、仓库管理、送货管理、自定义审批流、绩效管理、客户管理、合同管理等功能。提供…

抖音支付回调验签 go 版本

序言 最近在做抖音小程序支付&#xff0c;由于抖音开放平台的文档写的较为简陋&#xff0c;让人踩了不少坑&#xff0c;在这里整理一下做小程序支付的整个过程&#xff0c;以通用交易系统为例子。 准备条件 1&#xff09;申请小程序&#xff0c;开通支付功能 这里需要明确你小…

Linux--基本指令

目录 1.ls指令 ​2.pwd指令 3.cd指令 4.tree指令 5.touch/mkdir/rmdir(rm)指令 6.cp/mv/cat/tac指令 7.head/tail/管道 8.date 9.find/which/grep 10.其它小知识 1.ls指令 补充知识&#xff1a; 2.pwd指令 补充知识&#xff1a; 3.cd指令 补充知识&#xff1a; 4.tree指令 …

Java语法-类和对象之抽象类和接口

1.抽象类 1.1 抽象类的概念 一个类中没有足够的信息来描述一个具体的对象,这样的类就是抽象类 比如: 从图中我们可以看出,只有继承了的类,我们产生的实例,调用的draw方法都是他们本身重写的draw方法,不会调用父类Shape的draw()方法,因此我们可以不管父类里面的draw()方法里面的…

MySQL 之多表设计详解

在实际应用场景中&#xff0c;我们经常需要处理包含多种数据实体及其之间复杂关系的业务逻辑&#xff0c;例如电商平台的用户、商品、订单&#xff0c;社交网络的用户、帖子、评论等等。如果将所有数据都堆砌在一张表中&#xff0c;不仅会造成数据冗余、难以维护&#xff0c;还…

MySQL 8.0.34 从C盘迁移到D盘

因为开始C盘够用&#xff0c;没注意mysql安装位置&#xff0c;如今C盘爆满&#xff0c;只能把mysql转移到D盘&#xff0c;以腾出更多的空间让我折腾。 一、关闭mysql服务 二、找到C盘MySQL安装文件和Data文件 1.找到C盘mysql bin文件目录安装文件路径&#xff1a; C:\Progra…

行为设计模式 -模板方法模式- JAVA

模板方法模式 一 .简介二. 案例2.1 抽象类&#xff08;Abstract Class&#xff09;2.2 具体子类&#xff08;Concrete Class&#xff09;2.3 测试 三. 结论3.1 优缺点3.2 适用场景3.3 要点 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接…

linux从入门到精通--从基础学起,逐步提升,探索linux奥秘(六)

linux从入门到精通–从基础学起&#xff0c;逐步提升&#xff0c;探索linux奥秘&#xff08;六&#xff09; 一、linux高级指令&#xff08;1&#xff09; 1、hostname指令 1&#xff09;作用&#xff1a;操作服务器的主机名&#xff08;读取、设置&#xff09; 2&#xff0…

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…

Python自动收发邮件的详细步骤与使用方法?

Python自动收发邮件教程&#xff1f;Python怎么实现收发邮件&#xff1f; Python作为一种强大的编程语言&#xff0c;提供了丰富的库和工具&#xff0c;使得自动收发邮件变得简单而高效。AokSend将详细介绍如何使用Python自动收发邮件&#xff0c;帮助读者掌握这一实用技能。 …

【ASE】第四课_护盾效果(有碰撞效果)

今天我们一起来学习ASE插件&#xff0c;希望各位点个关注&#xff0c;一起跟随我的步伐 今天我们来学习护盾的效果。 思路&#xff1a; 1.添加纹理贴图和法线贴图&#xff08;这里省略&#xff09; 2.添加护盾边缘顶点扰动效果&#xff0c;也可以理解成变形效果 3.添加碰撞…

关于frp Web界面-----frp Server Dashboard 和 frp Client Admin UI

Web 界面 官方文档&#xff1a;https://gofrp.org/zh-cn/docs/features/common/ui/ 目前 frpc 和 frps 分别内置了相应的 Web 界面方便用户使用。 客户端 Admin UI 服务端 Dashboard 服务端 Dashboard 服务端 Dashboard 使用户可以通过浏览器查看 frp 的状态以及代理统计信…

59 双向循环神经网络_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录双向RNN推理 总结以下为理论部分双向循环神经网络隐马尔可夫模型中的动态规划双向模型定义模型的计算代价及其应用 (**双向循环神经网络的错误应用**)小结练习 双向RNN 这里理解这个图的时候&#xff0c;不要把正向和逆向认为有上下的关系&a…

计算机毕业设计 基于Python的音乐平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

IDE 使用技巧与插件推荐(含例说明)

在使用集成开发环境&#xff08;IDE&#xff09;进行编程时&#xff0c;掌握一些技巧和使用高效的插件可以显著提高开发效率。以下是一些通用的IDE使用技巧和插件推荐&#xff0c;适用于多种流行的IDE&#xff0c;如IntelliJ IDEA、Visual Studio Code、PyCharm等。每个技巧和插…