当前位置: 首页 > news >正文

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请求都是独立的,服务器不会记住之前发生过的请求。
  • 也就是:每个请求都是独立的,服务器处理完请求后就会结束会话,不会保留任何会话信息
  • 为了解决无状态协议带来的问题,引入了CookiesSession等技术来维持用户会话。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实现简单的换肤功能

实现的换肤功能:主题色切换、亮色模式和暗黑模式切换、背景图切换 主题色就是网站主色,可以配置到组件库上面;亮色模式又分为两种风格:纯白风格和背景图风格,不需要背景图的话可以删掉这部分逻辑和相关定义&#xff1b…...

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项目,一来证明了集团在行业中的翘楚地位,二来感谢各位领导给予的大力支持接下来的一周,项目经理、业务顾问相继入场&#xff0…...

【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…...

DNS区域传送漏洞详解:从原理到防御(以Bind9为例)

DNS区域传送漏洞深度解析与BIND9安全加固实战指南 当你在浏览器输入一个网址时,背后发生的DNS查询过程就像一场精密的交响乐演出。而区域传送(Zone Transfer)作为DNS系统中的关键机制,本应是乐谱中协调各声部的指挥棒&#xff0c…...

文墨共鸣大模型安装包依赖分析与环境冲突解决

文墨共鸣大模型安装包依赖分析与环境冲突解决 你是不是也遇到过这种情况:拿到一个项目,兴冲冲地运行 pip install -r requirements.txt,结果屏幕上开始疯狂报错,各种版本不兼容、找不到模块、编译失败的信息轮番轰炸。折腾了几个…...

手把手教你用Qwen2.5-7B-Instruct:基于vllm+chainlit快速搭建智能助手

手把手教你用Qwen2.5-7B-Instruct:基于vllmchainlit快速搭建智能助手 想快速拥有一个属于自己的、功能强大的智能对话助手吗?今天,我们就来一起动手,基于Qwen2.5-7B-Instruct这个优秀的开源大模型,配合vLLM的高效推理…...

EnCase、FTK还是取证大师?2024年主流电子取证工具横评与选型指南(附学习路径)

EnCase、FTK还是取证大师?2024年电子取证工具选型与职业发展全指南 当你的硬盘突然变成犯罪现场,键盘敲击声就是指纹,而每一串代码都可能成为呈堂证供——这就是电子取证专家的日常。在这个数据爆炸的时代,电子取证已从警方的技术…...

wiliwili与Switch视频播放:解锁离线观影新体验

wiliwili与Switch视频播放:解锁离线观影新体验 【免费下载链接】wiliwili 专为手柄控制设计的第三方跨平台B站客户端,目前可以运行在PC全平台、PSVita、PS4 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili 在没…...

xhs:突破小红书数据采集壁垒的5个实战方法

xhs:突破小红书数据采集壁垒的5个实战方法 【免费下载链接】xhs 基于小红书 Web 端进行的请求封装。https://reajason.github.io/xhs/ 项目地址: https://gitcode.com/gh_mirrors/xh/xhs 从反爬困境到合规采集的完整解决方案 在数字化营销与市场研究领域&am…...

5分钟快速上手:AnythingtoRealCharacters2511动漫图片转真人照片教程

5分钟快速上手:AnythingtoRealCharacters2511动漫图片转真人照片教程 1. 认识你的动漫转真人工具 1.1 工具能做什么? AnythingtoRealCharacters2511是一个专门将动漫图片转化为真人照片的AI工具。它基于Qwen-Image-Edit模型开发,特别擅长处…...

绝地求生罗技鼠标宏配置全攻略:从零到精通的压枪优化指南

绝地求生罗技鼠标宏配置全攻略:从零到精通的压枪优化指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 还在为《绝地求生》中的枪口…...

STM32F103C8T6接KY-9250陀螺仪,串口数据解析与姿态角计算全流程(附避坑点)

STM32F103C8T6与KY-9250陀螺仪实战:从硬件对接到姿态解算的完整指南 第一次拿到STM32开发板和KY-9250模块时,那种既兴奋又忐忑的心情记忆犹新——兴奋于即将实现酷炫的姿态检测功能,忐忑于不知从何下手的迷茫。本文将以手把手的方式&#xff…...

告别手动上传!RAGFlow 0.22.0 数据源同步实战:以S3和Notion为例的保姆级配置

告别手动上传!RAGFlow 0.22.0 数据源同步实战:以S3和Notion为例的保姆级配置 如果你还在为知识库维护中频繁的手动上传文件而烦恼,RAGFlow 0.22.0版本的数据源功能将成为你的效率救星。这个功能彻底改变了传统文件管理方式,让数据…...