第八章会话控制

news2025/5/15 7:36:16

文章目录

  • 为什么需要会话控制
      • 带来的问题
  • 如何解决无状态的问题——Cookie
  • 如果只靠单纯的Cookie存在的问题
  • 单纯Cookie导致问题的解决方法——Session
      • Session
      • session的结构
      • 一些关于Session的API
      • Session的保存作用域
  • Cookie时效性
        • 会话和持久化Cookie对比
      • Cookie的domain和path

为什么需要会话控制

Http是无状态的协议

  • HTTP 无状态 :服务器无法判断这两次请求是同一个客户端发过来的,还是不同的客户端发过来的
  • 无状态的意思换句话说,服务器记不住你,可能你每刷新一次网页,就要重新输入一次账号密码进行登录。这显然是让人无法接受的
  • 用生活中的例子来说
    • 比如我们A(服务器)这个人开了一家商店,A这个人有一个特点,就是非常健忘,它的记忆只能维持到一个用户提出购买请求,和服务结束这一段时间

带来的问题

  • 我们可能会有一些需求,比如我们需要区分不同请求-响应,请求响应是不是同一个用户发送的,比如用户购买的越多,折扣就越大,那我们就需要分辨出不同的请求响应之间的逻辑关系,所以引入cookie体系
  • 或者无状态态带来的现实问题:第一次请求是添加商品到购物车,第二次请求是结账;如果这两次请求服务器无法区分是同一个用户的,那么就会导致混乱
    • 通过会话跟踪技术来解决无状态的问题。

在这里插入图片描述

保持用户登录状态,背后的底层逻辑是:服务器在接收到用户请求的时候,有办法判断这个请求来自于之前的某一个用户。所以保持登录状态,本质上是保持**『会话状态』**

如何解决无状态的问题——Cookie

以生活举例子

img

  • Cookie:就相当于A(服务器)发给每个客户(客户端)的一个凭证,客户必须有保存这个凭证的责任(你丢了,我就不知道你是不是你了),也必须在每次接收服务的时候带着这个凭证(你不带,我也不知道你是不是你)
  • 发凭证:从服务器到客户端,所以肯定是在响应体中,Set-Cookie
  • 携带凭证:从客户端到服务器,所以肯定在请求体中 Cookie
  • 我说的是「一个」cookie 可以认为是一个变量,形如 name=value,但是服务器可以一次设置多个 cookie,所以有时候说 cookie 是「一组」键值对儿,这也可以说得通。

具体的实现

image-20221211215437628

使用HttpSession对象,将数据存入会话域就能保持会话状态。

HttpSession session = request.getSession();
session.setAttribute("user", user);

具体实例证明

//演示Cookie
public class Demo3 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session,如果获取不到,则创建一个新的
        Cookie cookie1=new Cookie("name","lsc");
        Cookie cookie2=new Cookie("age","22");
        response.addCookie(cookie1);
        response.addCookie(cookie2);
    }
}

第一次在浏览器上访问demo3

在这里插入图片描述

  • 我们看到了在服务器中设置的Cookie值我们返回给了服务端,存储在Response Headers——实现了对应的发凭证的操作

第二次在同一个浏览器上访问demo3

image-20221211221105721

  • 第二次浏览器发送demo3请求,我们的请求中的请求头中携带对应的Cookie值——完成了携带凭证

如果只靠单纯的Cookie存在的问题

  • 安全问题:如果我们把cookie完全交给客户端,我们服务器完全信任cookie,那么如果碰到恶意用户或者恶意程序进行修改伪造别人的cookie,那么是不安全的
  • 性能问题:我们也知道现在的很多网站功能很复杂,而且涉及很多的数据交互,比如说电商网站的购物车功能,信息量大,而且结构也比较复杂,无法通过简单的 cookie 机制传递这么多信息,而且要知道 cookie 字段是存储在 HTTP header 中的,就算能够承载这些信息,也会消耗很多的带宽,比较消耗网络资源。
    • 因为我们上面的Cookie只是为了让服务器知道我是谁

单纯Cookie导致问题的解决方法——Session

  • 解决方法:拆分保存数据,把敏感的数据保存到服务器的内部,cookie只携带不敏感的信息,通常来说就是一个卡号也就是我们的SessionID,也就引入我们的session机制

在这里插入图片描述

  • 就类似我们服务器来保存重要的数据(洗浴),客户端来拿着卡号去对应的柜子去取东西(我们的随身物品)

Session

  • Session:是保存在服务器的,专属某次会话的,一组数据,可以跨请求访问(生命周期是跨请求的),通常Session中保存的数据也可以视为name-value.,一般cookie设置session-id.这样客户端和服务器之间仍然使用cookie机制,只是cookie只传递id即可(cookie还是放在我们的请求头和响应头中的,存储的是session-id),大头数据全部保存在服务器

session的结构

在这里插入图片描述

  • session类似一个卡号对应着一个柜子的结构,然后一个柜子也是一个Map的结构,因为柜子要存储name:value

一些关于Session的API

  • request.getSession() -> 获取当前的会话,没有则创建一个新的会话

    • request.getSession(true) -> 效果和不带参数相同

    • request.getSession(false) -> 获取当前会话,没有则返回null,不会创建新的

./images

  • session.getId() -> 获取sessionID

  • session.isNew() -> 判断当前session是否是新的

  • session.getMaxInactiveInterval() -> session的非激活间隔时长,默认1800秒

    • session.setMaxInactiveInterval()设置最大的非激活间隔时长

    • 比如我们一些银行的网页,如果三分钟不操作,可能当前账号就需要重新登录

    • 为什么Session要设置时限

      • 用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。
    • 设置时限的难点

      • 从服务器端的角度,很难精确得知类似浏览器关闭的动作。而且即使浏览器一直没有关闭,也不代表用户仍然在使用。

./images

  • session.invalidate() -> 强制性让会话立即失效

Session的保存作用域

Demo4资源

//演示向HttpSession保存数据
public class Demo4 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.getSession().setAttribute("uname","lina");
    }
}

Demo5资源

public class Demo5 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object unameObj = request.getSession().getAttribute("uname");
        System.out.println(unameObj);
    }
}
  • 我们在同一个浏览器先去访问Demo4,然后再去访问我们的Demo5,发现输出了lina
  • 我们在一个浏览器去访问Demo4,然后换一个浏览器访问Demo5,发现输出的值是null
  • 说明我们的session保存的信息作用域是可以跨请求的,session保存作用域是和具体的某一个session对应的

image-20221211223838035

  • void session.setAttribute(k,v)
  • Object session.getAttribute(k)
  • void removeAttribute(k)

Cookie时效性

  • 会话级Cookie
    • 服务器端并没有明确指定Cookie的存在时间
    • 在浏览器端,Cookie数据存在于内存中
    • 只要浏览器还开着,Cookie数据就一直都在
    • 浏览器关闭,内存中的Cookie数据就会被释放
  • 持久化Cookie
    • 服务器端明确设置了Cookie的存在时间
    • 在浏览器端,Cookie数据会被保存到硬盘上
    • Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
    • 持久化Cookie到达了预设的时间会被释放

服务器端返回Cookie时附带过期时间的响应消息头如下

image-20221211225923306

服务器通知浏览器删除Cookie时的响应消息头如下

image-20221211230029495

会话和持久化Cookie对比

image-20221211230109363

Cookie的domain和path

上网时间长了,本地会保存很多Cookie。对浏览器来说,访问互联网资源时不能每次都把所有Cookie带上。浏览器会使用Cookie的domain和path属性值来和当前访问的地址进行比较,从而决定是否携带这个Cookie。

image-20221211230159958

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

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

相关文章

后端开发框架的具体内容是什么?

在数据化管理越来越规范的今天,低代码开发平台也迎来了重要的发展期。前后端分离已经成为发展趋势,有不少客户朋友想要咨询后端开发框架的定义和内容,为了帮助大家答疑解惑,小编经过整理,组织出了一篇关于该内容的文章…

centos7 安装部署sonarqube 8.9.1(postqresql数据库版)

公司产品sonarqube以最大限度地提高质量并管理软件产品组合中的风险。为开发者软件开发人员最终负责代码质量。 代码质量是所谓的非功能性需求的一部分,因此是开发人员的直接责任。为有追求的程序员写出地道代码提供方向。 一、环境要求 1、centos7 x64 2、jdk11 3…

KT6368A蓝牙芯片用户PC升级_搭配下载器_使用说明

目录 一、下载原理简介 KT6368A双模蓝牙芯片是flash版本,支持重复烧录程序,但是烧录程序必须使用专用的下载工具 这个工具需要由我们来提供。 下载的总体思路是,把芯片和PC电脑相连接,通过USB。然后PC端有上位机工具&#xff0…

Zabbix

一、什么是Zabbix zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 zabbix 由 2 部…

Spring Boot 整合 RabbitMQ

一、工程简介 1、生产者&#xff08;test-11-rabbitmq-producer&#xff0c;spring boot 版本 2.4.1&#xff09; 1&#xff09;pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifact…

外汇天眼:分分飞艇──谎称33倍高收益,入金投资获利要不回

在这个万物皆涨、薪水不涨的年代&#xff0c;大多数人都知道投资的重要性&#xff0c;但因为受限于本身的知识与技巧不足&#xff0c;经常看错市场方向或选错标的而亏损&#xff0c;并因此感到苦恼不已。此时若看到人宣称有无风险高获利的赚钱管道&#xff0c;不免会跃跃欲试。…

SM59 事物码里的错误消息 SECSTORE035

系统无法访问全局键值&#xff0c;其存储位置 在配置文件参数 rsec/securestorage/keyfile 中指定。 使用事物码 RZ11&#xff0c;输入 rsec/securestorage/keyfile&#xff0c;点击 Display&#xff1a; 当这个参数路径指向的 .pse 文件包含非法字符或者文件内容小于 48 个字…

Matlab实现|多元宇宙算法求解电力系统多目标优化问题(期刊论文复现)

结果和这几种算法进行比较&#xff1a; 目录 1 概述 2 Matlab完整代码实现 3 结果 1 概述 提出了一种求解电力系统环境经济调度的新方法,该方法利用宇宙空间在随机创建过程中高膨胀率的物体随虫洞在空间移动物体的规律,通过对白洞和黑洞间随机传送物体来实现最优搜索. 算法…

5.1 自然语言处理综述

文章目录致命密码&#xff1a;一场关于语言的较量一、自然语言处理的发展历程1.1 兴起时期1.2 符号主义时期1.3 连接主义时期1.4 深度学习时期二、自然语言处理技术面临的挑战2.1 语言学角度2.1.1 同义词问题2.1.2 情感倾向问题2.1.3 歧义性问题2.1.4 对话/篇章等长文本处理问题…

猿如意中【ndm】助你轻松管理你的 NPM包

目录 一、ndm 简介 1.1、下载 ndm-1.exe 版本&#xff08;v1.2.0&#xff09; 1.2、安装 1.3、版本迭代更新记录 1.3.1、ndm v0.1.4 已发布https://github.com/720kb/ndm/releases/tag/v0.1.4 1.3.2、ndm v1.0.0 发布&#xff0c;现已完全跨平台Windows、Mac、Linux 1.3.3、…

cad 怎么取消绘图界限?cad怎么调整图形界限

1、在CAD中&#xff0c;如何设置图形界限&#xff1f; 1、电脑打开CAD&#xff0c;输入limits命令&#xff0c;空格键确定。 2、确定命令后&#xff0c;选择格式中的图形界限。 3、点击图形界限后&#xff0c;会出现重新设置模型空间界限&#xff0c;接着再点击键盘上的回车键…

gcexcel:GrapeCity Documents for Excel v6/NET/Crack

高速 .NET 6 Excel 电子表格 API 库 使用此快速电子表格 API&#xff0c;以编程方式在 .Net 6、.Net 5、.NET Core、.NET Framework 和 Xamarin 跨平台应用程序中创建、编辑、导入和导出 Excel 电子表格。 创建、加载、编辑和保存 Excel .xlsx 电子表格 保存为 .XLSX、PDF、HTM…

C#基于ASP.NET的人事薪资管理系统

ASP.NET20003人事薪资管理系统,SQL数据库&#xff1a;VS2010开发环境,包含员工管理,部门管理,工资管理,绩效管理等功能,并且包含五险一金的计算 3.3 功能需求 3.3.1 员工部分 1&#xff1a;查看工资&#xff1a;以列表的形式查看系统现存的员工工资信息。 2&#xff1a;查看个…

SpringBoot自定义banner—卡塔尔世界杯吉祥物

自定义banner文件 SpringBoot项目在启动的时候&#xff0c;会有一个大大的Spring首先展示出来 . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|…

好书推荐:《Python编程:从入门到实践(第2版)》——写给Python入门者的最好教程

缘起 这段时间把图灵社区的《Python编程&#xff1a;从入门到实践&#xff08;第2版&#xff09;》看完了&#xff0c;在此做一个记录&#xff0c;先谈一下自己最直观的感受&#xff0c;这本书的定位是入门&#xff0c;在我看来&#xff0c;这个目的确实是达到了的&#xff0c…

98.(leaflet之家)leaflet态势标绘-分队战斗行动采集

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

Cantor表——洛谷(Java)

题目描述 现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的&#xff1a; 1/11/1 , 1/21/2 , 1/31/3 , 1/41/4, 1/51/5, … 2/12/1, 2/22/2 , 2/32/3, 2/42/4, … 3/13/1 , 3/23/2, 3/33/3, … 4/14/1, 4/24/2, … 5/1…

04. XSS漏洞原理

04. XSS漏洞原理 XSS漏洞原理&#xff08;上&#xff09; 弹窗是怎么实现的&#xff1f; 案例 攻击利用 什么是XSS&#xff1f; XSS&#xff08;Cross Site Scripting&#xff09;&#xff1a;跨站脚本攻击&#xff0c;为了不和层叠样式表&#xff08;Cascading Style Shee…

tensorflow 歌曲题材分类

librosa音频处理 Librosa是一个用于音频、音乐分析、处理的python工具包&#xff0c;一些常见的时频处理、特征提取、绘制声音图形等功能应有尽有&#xff0c;功能十分强大. 加载音频 import librosa x , sr librosa.load(music.au) #歌曲的时长 d librosa.get_duration(…

【Matlab】论文各种图例配色Matlab绘制

1. Matlab 绘图 1.1. Plot 函数 x-pi:pi/10:pi; %以pi/10为步长 ytan(sin(x))-sin(tan(x)); %求出各点上的函数值 plot(x,y,--rs,... %绘制红色的虚线&#xff0c;且每个转折点上用正方形表示。LineWidth,2,... % 设置线宽为2Marke…