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

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

http://www.lryc.cn/news/499558.html

相关文章:

  • java抽象类
  • minio集群部署–linux环境
  • 在vue3里使用scss实现简单的换肤功能
  • JavaScript编写css自定义属性
  • 我们来学webservie - WSDL
  • 【Agent】构建智能诗歌创作系统:基于多 Agent 的协同创作实现
  • 001 LVGL PC端模拟搭建
  • AJAX三、XHR,基本使用,查询参数,数据提交,promise的三种状态,封装-简易axios-获取省份列表 / 获取地区列表 / 注册用户,天气预报
  • mybatis之数据统计与自定义异常处理
  • qt creator使用taglib读取音频元信息,windows平台vcpkg安装
  • 设计模式之生成器模式
  • python学opencv|读取图像(三)放大和缩小图像
  • 1 数据库(上):MySQL的概述和安装、SQL简介、IDEA连接数据库使用图形化界面
  • C++初阶—类与对象(中篇)
  • Leetcode15. 三数之和(HOT100)
  • Oracle数据库小白备忘
  • DDR4与DDR3服务器内存的关键区别有哪些?
  • Linux: shell: bash: set -x;调试使用
  • Hadoop生态圈框架部署 伪集群版(五)- HBase伪分布式部署
  • 自定义指令,全局,局部,注册
  • 静坐修心.
  • 设计模式c++(一)
  • 核密度估计——从直方图到核密度(核函数)估计_带宽选择
  • Vant UI Axure移动端元件库:提升移动端原型设计效率
  • 如何用 JavaScript 操作 DOM 元素?
  • 【Ubuntu】URDC(Ubuntu远程桌面助手)安装、用法,及莫名其妙进入全黑模式的处理
  • ES-DSL查询
  • npm 设置镜像
  • SpringMvc完整知识点一
  • STM32G4系列MCU双ADC多通道数据转换的应用