JavaWeb学习(2)(Cookie原理(超详细)、HTTP无状态)
目录
一、HTTP无状态。
(1)"记住我"?
(2)HTTP无状态。
(3)信息存储客户端中。如何处理?
1、loaclStorage与sessionStorage。
2、Cookie。
二、Cookie。
(1)Cookie是什么?
(2)Cookie的特征。
1、Cookie组成。
2、Cookie的主要特性。
(3)Cookie的API。
1、创建Cookie。
2、发送Cookie。
3、获取Cookie值。
(4)Cookie的覆盖。
1、案例演示。
2、Cookie路径(path)。
3、Cookie覆盖。
(5)Cookie的生命周期。
1、什么是Cookie的生命?
2、Cookie死亡。
3、Cookie最大存活时间。
一、HTTP无状态。
(1)"记住我"?
- 通常,处于登录界面时,我们输入用户名与密码点击"提交"前,会有一个“记住我”功能!当用户名、密码验证成功,浏览器该如何存储对应的信息(用户名、密码等等)呢?
- 是保存在服务器?还是保存在客户端中?
(2)HTTP无状态。
- HTTP协议是无状态的,这意味着服务器不会保存任何关于客户端请求之间的信息。
- 每次HTTP请求都是独立的,服务器不会记住之前发生过的请求。
- 也就是:每个请求都是独立的,服务器处理完请求后就会结束会话,不会保留任何会话信息。
- 为了解决无状态协议带来的问题,引入了Cookies和Session等技术来维持用户会话。Cookies是客户端的存储机制,用于保存状态信息;而Session则是服务器端的存储机制,用于跟踪用户状态。
- 如果将“用户信息”存在在服务器中。那么就需要"东西"让服务器分辨当前是哪个用户访问,再给对应的用户信息。
- 这样服务器的压力就会很大!所以应该是每个用户的"登录个人信息"存储在用户所安装的客户端浏览器中,而不是存储在服务器。
- 这样当用户A登录时,从用户A的客户端浏览器拿到对应的信息。当用户B登录时,就从用户B客户端浏览器拿到对应的信息。这样就有效的区分了每个客户端的信息。
(3)信息存储客户端中。如何处理?
- 基于客户端浏览器的访问。如何将数据保存在客户端浏览器中?
- 登录校验的逻辑代码是在服务器端运行的。只要登录成功后,就会将(用户名、密码)存储在到客户端浏览器中。
- 如下三个被红色框选中的(客户端浏览器中)都可以存储信息。
1、loaclStorage与sessionStorage。
- 其中本地存储空间(loaclStorage)、会话存储(sessionStorage)空间:都是纯正的js技术。
- 它们之间的区别:loaclStorage是所有用户都可以拿到信息。(数据在浏览器关闭后仍可保留)而sessionStorage是在一次会话中有效。(与服务器一次通信)
2、Cookie。
- 既可以使用js操作,也可以使用Java进行操作!因为服务器端代码(/..xxServlet)也是Java语言写的,这就刚好可以使用这个"Cookie"。
- 接下来就详细的介绍Cookie!
二、Cookie。
(1)Cookie是什么?
- "Cookie"翻译成中文:小甜点,小饼干的意思。
- 在HTTP中它表示服务器发送给客户端浏览器的小甜点。
- 其实Cookie就是一个键和一个值(key/value)构成的,随着服务器端的响应发送给客户端浏览器。
- 注意:Cookie的存储的key/value都是String类型。域对象中存储的value是object类型。
- 如下:Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。
- 客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。
- 当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了!
(2)Cookie的特征。
1、Cookie组成。
- Cookie通常包含一个键(名称)、一个值,以及一些属性。(如有效期、路径、域和安全标志)
- 可以看到键"user"——>值"lisi"、键"password"——>值"123456"。
- 响应的服务器是本机:http://localhost:8080。
- 路径:"/"。表示所有的请求都可以拿到该Cookie。
2、Cookie的主要特性。
- Cookie的工作原理涉及到客户端(浏览器)和服务器之间的交互。
- Cookie创建于服务器,保存于客户端浏览器上。不同浏览器之间Cookie无法共享,无法跨浏览器。
- 客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
- Cookie本身是一种有用的技术,用于在客户端存储状态信息,但它也存在一些安全风险。在实际案例中,还需要对Cookie进行加密或者不存储敏感信息。(否则明文显示)
(3)Cookie的API。
- Cookie是一个类(class)。
1、创建Cookie。
- 通常都是使用:new 构造方法。
- 构造方法只有一个:new Cookie(键名,键值)。
- 案例演示。创建服务器:AServlet。创建两个Cookie(cookie1、cookie2)。并使用addCookie()方法发送到客户端对应的Cookie。如果不发送,客户端无法得到Cookie。
package com.fs.web;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** @Title: AServlet* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/27 下午4:52* @description: 测试类*/ @WebServlet("/AServlet") public class AServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//创建CookieCookie cookie1 = new Cookie("k1","v1000");Cookie cookie2 = new Cookie("k2","v2000");//发送Cookieresp.addCookie(cookie1);resp.addCookie(cookie2);} }
- 此时cookie1的k1与v1000、cookie2的k2与v2000都已经存储在客户端中。
2、发送Cookie。
- 服务器中调用方法:addCookie(Cookie对象)。
- 验证:之后的请求,客户端浏览器会自动的携带Cookie通过请求头发送给服务器。
- 创建BServlet,里面只重写了doGet()方法。直接再次请求访问BServlet。
package com.fs.web;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** @Title: BServlet* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/27 下午8:18* @description: 测试*/ @WebServlet("/BServlet") public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {} }
- 显然是自动的将Cookie发送给服务器了。
3、获取Cookie值。
- 方法1。通过request.getHeader("Cookie")。不推荐!
- 方法2。request.getCookies()。这样可以拿到所有的Cookie。再通过循环遍历,拿取对应的键名的键值。先通过getName()拿到键名,再根据键名拿到值getValue()。
package com.fs.web;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;/*** @Title: BServlet* @Author HeYouLong* @Package com.fs.web* @Date 2024/11/27 下午8:18* @description: 测试*/ @WebServlet("/BServlet") public class BServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取指定CookieCookie[] cookies = req.getCookies();for (Cookie cookie : cookies) {String name = cookie.getName();if(name.equals("k1")){String value = cookie.getValue();System.out.println(name);System.out.println(value);break;}}/*String cookie = req.getHeader("Cookie");System.out.println(cookie);*/} }
- 成功拿到键名"k1"对应的键值"v1000"。
(4)Cookie的覆盖。
1、案例演示。
- 先访问/AServlet。再访问/user/AServlet。看看对应的Cookie。
- /AServlet。
- /user/AServlet。
2、Cookie路径(path)。
- 可以通过设置Cookie的path来指定浏览器,在访问什么样的路径时,包含什么样的Cookie。
- 如果Cookie的name(键名)与path(路径)一样,就会覆盖value(键值)。
- 如果没有设置path:默认值,创建Cookie的资源(服务器)的上级路径!
- 像访问资源(/user/BServlet)对应的path:"/user"。访问资源(/BServlet)对应的path:"/"。
- 举例访问某个路径下的资源,能访问的对应Cookie。
- 创建Cookie时,主动设置Cookie路径。方法:setPath()。
3、Cookie覆盖。
- 修改"/user/AServlet"。重新访问。
(5)Cookie的生命周期。
1、什么是Cookie的生命?
Cookie不只是有name(键名)和value(键值)。Cookie还有生命。
所谓Cookie生命就是Cookie在客户端的有效时间。可以通过setMaxAge(int)来设置Cookie的最大有效时间。
2、Cookie死亡。
像上面的BServlet,我把所有的客户端浏览器关闭(结束本次会话)。对应的Cookie(cookie1的k1与v1000、cookie2的k2与v2000)消失了。
因为它们都是会话级别。会话结束,对应的Cookie自动失效。
- k1、k2已消失。
3、Cookie最大存活时间。
默认存活时间:会话级别。只有客户端的浏览器关闭,这个Cookie就会被删除!
注意:如果是服务器关闭,只要客户端不关闭,Cookie不会被删除。
调用setMaxAge(int 参数) 设置最大存活时间。参数的单位:秒。
具体的实践大家自己尝试!
相关文章:
JavaWeb学习(2)(Cookie原理(超详细)、HTTP无状态)
目录 一、HTTP无状态。 (1)"记住我"? (2)HTTP无状态。 (3)信息存储客户端中。如何处理? 1、loaclStorage与sessionStorage。 2、Cookie。 二、Cookie。 (1&…...
java抽象类
目录 一.抽象类 1.什么是抽象类 2.抽象类特点 (1)抽象类不能直接实例化对象 (2)可以包含抽象方法和具体方法 (3)可以有构造方法 (4)抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修…...
minio集群部署–linux环境
原文地址:minio集群部署–linux环境 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 第一步:安装 有rpm、deb、和二进制文件安装方式。参考文档在:MinIO Object Storage for Linux — MinIO Object Storage …...
在vue3里使用scss实现简单的换肤功能
实现的换肤功能:主题色切换、亮色模式和暗黑模式切换、背景图切换 主题色就是网站主色,可以配置到组件库上面;亮色模式又分为两种风格:纯白风格和背景图风格,不需要背景图的话可以删掉这部分逻辑和相关定义;…...
JavaScript编写css自定义属性
一、自定义属性 是在 CSS 中定义的变量,以 --开头。它们可以存储颜色、尺寸、字体等任何 CSS 值,并且可以在整个文档中重复使用。 :root {--primary-color: #3498db;--font-size: 16px; }body {color: var(--primary-color);font-size: var(--font-siz…...
我们来学webservie - WSDL
WSDL 题记WSDL系列文章 题记 举个例子 酒桌上大领导们谈笑风生,把酒临风,其喜洋洋者矣老张说能签下xx项目,一来证明了集团在行业中的翘楚地位,二来感谢各位领导给予的大力支持接下来的一周,项目经理、业务顾问相继入场࿰…...
【Agent】构建智能诗歌创作系统:基于多 Agent 的协同创作实现
在探索大语言模型的创意应用过程中,我们开发了一个基于多 Agent 的智能诗歌创作系统。本文将介绍如何通过多个专业化的 Agent 协同工作,实现根据地点和天气信息自动创作诗歌的功能。 GitHub Code 项目地址 核心架构设计 1. Agent 基类设计 from pydan…...
001 LVGL PC端模拟搭建
01 LVGL模拟器介绍 使用PC端软件模拟LVGL运行,而不需要任何嵌入式硬件 环境搭建:codeblocks-20.03mingw-setup 正常安装流程即可 工程获取:LVGL官网-> github仓库 本地安装包下载资源包 工程模版和软件安装包 补充:…...
AJAX三、XHR,基本使用,查询参数,数据提交,promise的三种状态,封装-简易axios-获取省份列表 / 获取地区列表 / 注册用户,天气预报
一、XMLHttpRequest基本使用 XMLHttpRequest(XHR)对象用于与服务器交互。 二、XMLHttpRequest-查询参数 语法: 用 & 符号分隔的键/值对列表 三、XMLHttpRequest-数据提交 核心步骤 : 1. 请求头 设置 Content-Type 2. 请求体 携带 符合要求 的数…...
mybatis之数据统计与自定义异常处理
文章目录 需求描述定义实体方式一、mybatisPlus实现方式二、自定义SQL实现简单查询过滤查询 异常处理1、SQL拼写异常 在使用Mybatis或MybatisPlus进行数据统计,在【 SpringBoot的Mybatis-plus实战之基础知识】中对mybatisplus引入有介绍,本次要使用其进…...
qt creator使用taglib读取音频元信息,windows平台vcpkg安装
注意:qt creator用的构建组件是qt 6.2.3 MSVC2019 64bit 安装vcpkg // 我的安装位置C:\vcpkg git clone https://github.com/microsoft/vcpkg.git C:\vcpkg cd C:\vcpkg .\bootstrap-vcpkg.bat// 设置系统环境变量 VCPKG_ROOT C:/vcpkg用vcpkg安装taglib vcpkg …...
设计模式之生成器模式
目录 1.简介 2.结构 3.使用场景 4.实例 5.优缺点 6.与其他模式的关系 7.总结 1.简介 生成器模式(Builder Pattern)是一种创建型设计模式,它允许你通过一步一步构建复杂对象,而不是通过一个包含大量参数的构造函数或方法。该…...
python学opencv|读取图像(三)放大和缩小图像
【1】引言 前序已经学习了常规的图像读取操作和图像保存技巧,相关文章链接为: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(二)保存彩色图像-CSDN博客 今天我们更近一步,学习放大和缩小图像的技巧&…...
1 数据库(上):MySQL的概述和安装、SQL简介、IDEA连接数据库使用图形化界面
文章目录 前言一、数据库相关的概念二、MySQL概述1 MySQL的安装和配置2 MySQL登录、退出(1)mysql -uroot -p1234 或者mysql -uroot -p ---- 登录(2)exit或者quit ---- 退出 3 远程登录服务器上的MySQL命令mysql -hip地址 -P3306 -…...
C++初阶—类与对象(中篇)
第一章:类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现&a…...
Leetcode15. 三数之和(HOT100)
链接 一般这种三数之和,四数之和都使用双指针,复杂度最优,次一级可使用哈希表。前者要求有序,后者空间上有花费。 题目: 题目要求答案中不能出现重复vector,比如{-1 1 0}和{-1 0 1}; 这两个…...
Oracle数据库小白备忘
sqlplus相关 导入sql文件 在sqlplus中,导入一个sql文件,是使用或者start。 如当前目录下有一个hello.sql,则可以使用 hello.sql 或者 start hello.sql 来进行导入,功能类似于mysql里面的source。 退出编辑模式 当使用sqlplus…...
DDR4与DDR3服务器内存的关键区别有哪些?
内存作为服务器性能的关键组件之一,已经经历了从DDR3到DDR4的过渡。DDR4内存相较于DDR3在多个方面有所提升,包括速度、带宽、功耗以及数据传输效率等。然而,尽管DDR4内存在性能上占有优势,DDR3内存依然在一些特定场景中得到了广泛…...
Linux: shell: bash: set -x;调试使用
man bash set -x -x After expanding each simple command, for command, case command, select command, or arithmetic for command, display the expanded value of PS4, followed by the command and its expanded arguments or associated word list. 这个可以帮助将变量…...
Hadoop生态圈框架部署 伪集群版(五)- HBase伪分布式部署
文章目录 前言一、Hbase伪分布式部署(手动部署)1. 下载Hbase2. 上传安装包3. 解压HBase安装包4. 配置HBase配置文件4.1 修改hbase-env.sh配置文件4.2 修改hbase-site.xml配置文件4.3 修改regionservers配置文件4.4 删除hbase中slf4j-reload4j-1.7.33.jar…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...























