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 参数) 设置最大存活时间。参数的单位:秒。

  • 具体的实践大家自己尝试!

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

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

相关文章

SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪

SpringBoot教程(三十二) | SpringBoot集成Skywalking链路跟踪 一、Skywalking是什么?二、Skywalking与JDK版本的对应关系三、Skywalking下载四、Skywalking 数据存储五、Skywalking 的启动六、部署探针 前提: Agents 8.9.0 放入 …

flask创建templates目录存放html文件

首先,创建flask项目,在pycharm中File --> New Project,选择Flask项目。 然后,在某一目录下,新建名为templates的文件夹,这时会是一个普通的文件夹。 然后右击templates文件夹,选择Unmark as …

Java进阶(注解,设计模式,对象克隆)

Java进阶(注解,设计模式,对象克隆) 一. 注解 1.1 什么是注解 java中注解(Annotation),又称java标注,是一种特殊的注释 可以添加在包,类,成员变量,方法,参数等内容上 注解会随同…

部署loki,grafana 以及springcloud用法举例

文章目录 场景docker 部署grafanadocker-compose部署loki维护配置文件 local-config.yaml维护docker-compose.yml配置启动 grafana 添加loki数据源springcloud用法举例查看loki的explore,查看日志 场景 小公司缺少运维岗位,需要研发自己部署日志系统,elk…

keil报错---connection refused due to device mismatch

解决办法如下: 记得改成1 把Enable取消

第三节、电机定速转动【51单片机-TB6600驱动器-步进电机教程】

摘要:本节介绍用定时器定时的方式,精准控制脉冲时间,从而控制步进电机速度 一、计算过程 1.1 电机每一步的角速度等于走这一步所花费的时间,走一步角度等于步距角,走一步的时间等于一个脉冲的时间 w s t e p t … ……

vue中pdf.js的使用,包括pdf显示,跳转指定页面,高亮关键词

目录 一、下载pdf.js 二、引入到本地的项目中 三、实现预览pdf 四、跳转到指定页面 五、利用pdf里面的find查找关键词 六、修改页面大小为实际大小 一、下载pdf.js https://github.com/mozilla/pdf.js 里面有很多的版本, 高版本的可能浏览器不兼容或者还要考…

Qt 小项目 学生管理信息系统

主要是对数据库的增删查改的操作 登录/注册界面: 主页面: 添加信息: 删除信息: 删除第一行(支持多行删除) 需求分析: 用QT实现一个学生管理信息系统,数据库为MySQL 要求&#xf…

“量子跃迁与数据织网:深入探索K最近邻算法在高维空间中的优化路径、神经网络融合技术及未来机器学习生态系统的构建“

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

硬件选型规则

光源选型: 先用型号中带H的,没有的选标准的. 光源和光源控制器的搭配需要确保接口一致。 根据型号表中的最佳工作距离和相机的尺寸。 光源控制器选型: 首先选择海康风格系列光源控制器考虑与光源的接口匹配。功率应该满足接近光源功率。检查是否退市…

【计算机网络】 —— 数据链路层(壹)

文章目录 前言 一、概述 1. 基本概念 2. 数据链路层的三个主要问题 二、封装成帧 1. 概念 2. 帧头、帧尾的作用 3. 透明传输 4. 提高效率 三、差错检测 1. 概念 2. 奇偶校验 3. 循环冗余校验CRC 1. 步骤 2. 生成多项式 3. 例题 4. 总结 四、可靠传输 1. 基本…

golang实现简单的redis服务

golang 手搓redis服务器仓库地址:实现思路: golang 手搓redis服务器 仓库地址: 仓库: https://github.com/dengjiayue/my-redis.git 实现思路: ● 协议: tcp通信 ● 数据包: 长度(4byte)方法(1byte)数据json ● 数据处理: 单线程map读写 ○ 依次处理待处理队列的请求(chan)…

智慧银行反欺诈大数据管控平台方案(八)

智慧银行反欺诈大数据管控平台的核心理念,在于通过整合先进的大数据技术、算法模型和人工智能技术,构建一个全面、智能、动态的反欺诈管理框架,以实现对金融交易的全方位监控、欺诈行为的精准识别和高效处理。这一理念强调数据驱动决策&#…

3D 生成重建019-LERF用文本在Nerf中开启上帝之眼

3D 生成重建019-LERF用文本在Nerf中开启上帝之眼 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 人类利用自然语言描述物理世界,根据各种特性(视觉外观、语义、抽象关联)寻找具体的3D位置。在这项工作中,作者提出了语言嵌…

如何选择合适的期刊投稿?从课题组经验到在线工具的使用全解析

~~~本文是作者个人的经验分享,建立在导师让自己选刊的情况下~~~ 投稿选刊是科研过程中至关重要的一步,选刊过程可能让许多初投稿的研究者感到迷茫和困惑:期刊那么多,如何找到最合适的? 本文将从多个角度介绍如何选择投…

.NET MAUI与.NET for Android/IOS的关系

2024年11月13日微软发布了.Net9.0,我打算体验一下。安装好.Net9.0 SDK后发现Visual Studio识别不到9.0,但是通过命令行dotnet --info查看是正常的,后面看到了VS有版本可以升级,把VS升级到17.12.0就可以了。更新完打开以后看到如下界面 这里…

【vivado】时序报告--best时序和worst时序

利用vivado进行开发时,生成best时序报告和worst时序报告。 best时序报告 slow选择min_max,fast选择none。 worst时序报告 fast选择min_max,slow选择none。

FastAPI 响应状态码:管理和自定义 HTTP Status Code

FastAPI 响应状态码:管理和自定义 HTTP Status Code 本文介绍了如何在 FastAPI 中声明、使用和修改 HTTP 状态码,涵盖了常见的 HTTP 状态码分类,如信息响应(1xx)、成功状态(2xx)、客户端错误&a…

第P1周:Pytorch实现mnist手写数字识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 1. 实现pytorch环境配置 2. 实现mnist手写数字识别 3. 自己写几个数字识别试试具体实现 (一)环境 语言环境:Python…

网络安全技术详解:虚拟专用网络(VPN) 安全信息与事件管理(SIEM)

虚拟专用网络(VPN)详细介绍 虚拟专用网络(VPN)通过在公共网络上创建加密连接来保护数据传输的安全性和隐私性。 工作原理 VPN的工作原理涉及建立安全隧道和数据加密: 隧道协议:使用协议如PPTP、L2TP/IP…