深入解析浏览器Cookie(图文码教学)

news2024/11/20 6:14:10

深入解析浏览器Cookie

  • 前言
  • 一、什么是 Cookie?
  • 二、Cookie的特点
  • 二、如何创建 Cookie?
  • 三、服务器如何获取 Cookie
  • 四、Cookie 值的修改
      • 4.1 方案一
      • 4.2 方案二
  • 五、浏览器查看 Cookie
  • 六、Cookie 生命控制
  • 七、Cookie 有效路径 Path 的设置
  • 八、案例:Cookie 练习---免输入用户名登录



前言

本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!


一、什么是 Cookie?

  1. Cookie 翻译过来是饼干的意思。
  2. Cookie是一种用于在客户端浏览器和服务器之间进行状态跟踪的技术。当用户访问一个网站时,服务器将一小段用于标识用户和跟踪用户访问行为的信息发送到用户的浏览器,浏览器将这些信息存储在用户的计算机上。然后,在用户下次访问该网站时,浏览器会将这些信息发送回服务器,从而实现用户的状态跟踪。
  3. Cookie 是服务器通知客户端保存键值对的一种技术。
  4. 客户端有了 Cookie 后,每次请求都发送给服务器。
  5. 每个 Cookie 的大小不能超过 4kb

二、Cookie的特点

Cookie的特点包括:

  1. 持久性:Cookie可以设置一个过期时间,在这个时间之前,浏览器会持续保存该Cookie并在用户下次访问网站时发送回服务器。这使得网站可以长期跟踪用户的行为和偏好。

  2. 可扩展性:Cookie可以存储任意类型的数据,如用户标识、用户首选项等。这使得网站可以根据用户的需求和行为来提供个性化的服务。

  3. 安全性:Cookie可以设置为只在通过安全连接(如HTTPS)时传输,或者只能通过服务器访问,从而增加了一定的安全性。

  4. 灵活性:Cookie可以通过设置路径和域来限制它们的作用范围,使得不同的网页或子域可以拥有各自的Cookie。

总的来说,Cookie在互联网应用中起到了重要的作用,它可以实现用户的状态跟踪和个性化服务。然而,由于Cookie会在用户计算机上存储一些个人信息,因此也引发了一些安全和隐私的问题。

二、如何创建 Cookie?

在这里插入图片描述

public class CookieServlet extends BaseServlet {
    protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建cookie对象
        Cookie cookie1 = new Cookie("key4","value4");
        //2. 通知客户端保存Cookie
        resp.addCookie(cookie1);
        //1. 创建cookie对象
        Cookie cookie2 = new Cookie("key5","value5");
        //2. 通知客户端保存Cookie
        resp.addCookie(cookie2);
        resp.getWriter().write("Cookie创建成功"); 
    }
}

三、服务器如何获取 Cookie

服务器获取客户端的 Cookie 只需要一行代码:req.getCookies():Cookie[]
在这里插入图片描述

public class CookieUtils {
    /**
     * 查找指定名称的Cookie对象
     * @param name
     * @param cookies
     * @return
     */
    public static Cookie findCookie(String name , Cookie[] cookies){
        if (name == null || cookies == null || cookies.length == 0) {
            return null;
        }

        for (Cookie cookie : cookies) {
            if (name.equals(cookie.getName())) {
                return cookie;
            }
        }

        return null;
    }

}

Servlet :

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie[] cookies = req.getCookies();



        for (Cookie cookie : cookies) {
            // getName方法返回Cookie的key(名)
            // getValue方法返回Cookie的value值
            resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
        }


        Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);

//        for (Cookie cookie : cookies) {
//            if ("key2".equals(cookie.getName())) {
//                iWantCookie = cookie;
//                break;
//            }
//        }
        // 如果不等于null,说明赋过值,也就是找到了需要的Cookie
        if (iWantCookie != null) {
            resp.getWriter().write("找到了需要的Cookie");
        }


    }

四、Cookie 值的修改

4.1 方案一

  1. 先创建一个要修改的同名(指的就是 key)的 Cookie 对象
  2. 在构造器,同时赋于新的 Cookie 值。
  3. 调用 response.addCookie( Cookie );

4.2 方案二

  1. 先查找到需要修改的 Cookie 对象
  2. 调用 setValue()方法赋于新的 Cookie 值。
  3. 调用 response.addCookie()通知客户端保存修改
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        方案一:
//        1、先创建一个要修改的同名的Cookie对象
//        2、在构造器,同时赋于新的Cookie值。
        Cookie cookie = new Cookie("key1","newValue1");
//        3、调用response.addCookie( Cookie ); 通知 客户端 保存修改
        resp.addCookie(cookie);

//        方案二:
//        1、先查找到需要修改的Cookie对象
        Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
        if (cookie != null) {
//            2、调用setValue()方法赋于新的Cookie值。
            cookie.setValue("newValue2");//值不能为中文,除非必须使用base64编码
//        3、调用response.addCookie()通知客户端保存修改
            resp.addCookie(cookie);
        }


        resp.getWriter().write("key1的Cookie已经修改好");

    }

五、浏览器查看 Cookie

谷歌浏览器如何查看 Cookie:
在这里插入图片描述
火狐浏览器如何查看 Cookie:
在这里插入图片描述
edge浏览器如何查看 Cookie:
在这里插入图片描述

六、Cookie 生命控制

  1. Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)
  2. setMaxAge()
    • 正数,表示在指定的秒数后过期
    • 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
    • 零,表示马上删除 Cookie
 /**
     * 设置存活1个小时的Cooie
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        Cookie cookie = new Cookie("life3600", "life3600");
        cookie.setMaxAge(60 * 60); // 设置Cookie一小时之后被删除。无效
        resp.addCookie(cookie);
        resp.getWriter().write("已经创建了一个存活一小时的Cookie");

    }

    /**
     * 马上删除一个Cookie
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 先找到你要删除的Cookie对象
        Cookie cookie = CookieUtils.findCookie("key4", req.getCookies());
        if (cookie != null) {
            // 调用setMaxAge(0);
            cookie.setMaxAge(0); // 表示马上删除,都不需要等待浏览器关闭
            // 调用response.addCookie(cookie);
            resp.addCookie(cookie);

            resp.getWriter().write("key4的Cookie已经被删除");
        }

    }

    /**
     * 默认的会话级别的Cookie
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("defalutLife","defaultLife");
        cookie.setMaxAge(-1);//设置存活时间
        resp.addCookie(cookie);
    }

七、Cookie 有效路径 Path 的设置

  1. Cookie 的有效路径(Path)指定了哪些路径下发送的请求会附带该 Cookie。只有与 Cookie 的有效路径匹配的请求才会携带该 Cookie。

常见的可选值有以下几种:

  • 默认值(/):表示服务器的根路径,所有请求都会携带该 Cookie;
  • 特定路径:例如,设置为 /myapp 表示只有路径以 /myapp 开头的请求会携带该 Cookie;
  • 精确路径:例如,设置为 /myapp/index.html 表示只有请求路径为 /myapp/index.html 的请求会携带该 Cookie;
  • 目录路径(目录名后带斜杠):例如,设置为 /myapp/ 表示只有路径以 /myapp/ 开头的请求会携带该 Cookie。例如,请求路径为 /myapp/page1 或者 /myapp/page2 都会携带该 Cookie。
  1. 注意事项:

    • Cookie 的有效路径是以斜杠 / 开头的路径字符串。
    • 如果不指定有效路径,默认为根路径,即所有请求都会携带该 Cookie。
    • Cookie 只会被发送到与其有效路径匹配的请求中。
    • 如果请求路径包含多个目录,例如 /myapp/subfolder/page.html,则该请求会携带该路径下的所有符合条件的 Cookie。
  2. 有效路径的设置可以帮助服务器控制哪些请求会附带 Cookie,从而实现更精确的控制和提高安全性。

  3. 举例:

CookieA path=/工程路径
CookieB path=/工程路径/abc

举例一:
请求地址如下: http://ip:port/工程路径/a.html
CookieA 发送
CookieB 不发送
举例二:
http://ip:port/工程路径/abc/a.html
CookieA 发送
CookieB 发送

  protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("path1", "path1");
        // getContextPath() ===>>>>  得到工程路径
        cookie.setPath( req.getContextPath() + "/abc" ); // ===>>>>  /工程路径/abc
        resp.addCookie(cookie);
        resp.getWriter().write("创建了一个带有Path路径的Cookie");
    }

八、案例:Cookie 练习—免输入用户名登录

在这里插入图片描述
login.jsp

<%--
  Created by IntelliJ IDEA.
  User: Hey
  Date: 2022/4/10
  Time: 19:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/13_cookie_session/LoginServlet" method="get">
    用户名:<input type="text" name="username"  value="${cookie.username.value}"/></br>
    密码:<input type="password" name="password"></br>
    <input type="submit" value="提交">
</form>


</body>
</html>

loginServlet

public class loginServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("username");
        String password = request.getParameter("password");
        if("abc".equals(name)&&"123456".equals(password)){
            Cookie cookie = new Cookie("username","abc");
            response.addCookie(cookie);
            System.out.println("登陆成功!");
            cookie.setMaxAge(60*60*24*7);
        }else{
            System.out.println("登陆失败!");
        }
    }
}

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

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

相关文章

183_Power BI 折线图之平滑线性类型

183_Power BI 折线图之平滑线性类型 一、背景 曾几何时&#xff0c;为了在 Power BI 让折线图显示出平滑曲线&#xff0c;各路大佬是尽显神通。如今时间来到 2023 年 7 月&#xff0c;刚刚更新的 Power BI 已经支持折线图的平滑曲线。让我们来看看最终效果。 同时&#xff0c…

【SpringBoot3】--04.核心原理

文章目录 SpringBoot3-核心原理1.事件和监听器1.1生命周期监听1.1.1 监听器-SpringApplicationRunListener1.1.2生命周期全过程 1.2事件触发时机1.2.1各种回调监听器1.2.2完整触发流程 1.3SpringBoot事件驱动开发 2.自动配置原理2.1入门理解2.1.1自动配置流程2.1.2SPI机制2.1.3…

apache ranger

简介&#xff1a; ranger 是一个用于启用、监控和管理跨hadoop平台的全面的数据安全框架。 ranger的愿景是在hadoop系统中提供全面的安全管理。随着yarn的出现&#xff0c;hadoop 平台能够支持真正的数据糊架构。企业能够在多租户环境中运行多个任务负载。hadoop 数据安全需要…

面向对象编程/原型及原型链

一.面向对象 (1)对象是什么?为什么要面向对象? 通过对代码的抽象,进而描述单个种类物体的方式. (2)特点:面向对象-逻辑上迁移更加灵活,代码的复用性更高,高度的模块化. (3)对象的理解 1.对象是对于单个物体的简单抽象; 2.对象是容器,封装了属性和方法 **属性:对象状态…

Python官方文档中Availability: not Emscripten, not WASI是什么意思?

在我们阅读Python官方文档中&#xff0c;当某个模块或特性的文档中写着 "Availability: not Emscripten, not WASI" 时&#xff0c;它表示该模块或特性在 Emscripten 和 WASI 环境中不可用。 Emscripten 是一个工具链&#xff0c;用于将C和C代码编译为WebAssembly&am…

【Python从入门到进阶】28、xpath的安装以及使用

接上篇《27、Handler处理器使用及代理和Cookie登录实现》 上一篇我们讲解了urllib中Handler处理器的基本使用&#xff0c;以及实现代理访问和Cookie的登录。本篇我们来讲解HTML文档解析中的核心插件xpath的安装及使用。 一、xpath介绍 XPath是由W3C&#xff08;World Wide We…

kotlin中使用Room数据库(包含升降级崩溃处理)

目录 1.导入依赖库 2.数据实体类 3.数据访问对象 (DAO) 4.数据库类 5.调用DAO里面的“增、删、改、查”方法 6.数据库升降级处理 升级&#xff08;保存数据库历史数据&#xff09;&#xff1a; 升级&#xff08;不保存数据库历史数据&#xff09;&#xff1a; 降级&…

剑指 offer 数学算法题:数值的整数次方

题目描述&#xff1a; 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 分析&#xff1a; 直接计算法&#xff0c;通过判断 n 的正负&#xff0c;若为负数&#xff0c; x 即…

无法加载文件\venv\Scripts\Activate.ps1,因为在此系统上禁止运行脚本

一、问题发生 运行环境Windows 10、python 3.11.1、IDE VScode 当然你可能使用了其他IDE&#xff0c;例如pycharm等&#xff0c;不过没有关系解决问题的方法都是一致的。 报错信息如下图所示&#xff1a; actvivate.ps1这个脚本文件是用来激活python虚拟环境的。 其实&…

LabVIEW开发图像采集和图像处理程序

LabVIEW开发图像采集和图像处理程序 扫描电子显微镜&#xff08;SEM&#xff09;是一种功能强大的工具&#xff0c;广泛用于高分辨率的生物和半导体样品检测。然而&#xff0c;对于大面积或3D成像&#xff0c;SEM成像是一个耗时的过程。MBSEM旨在通过同时扫描多个像素来减少采…

spring5源码篇(10)——spring-aop代理过程

spring-framework 版本&#xff1a;v5.3.19 文章目录 1、ProxyFactory1.1、createAopProxy() 创建AopProxy1.2、getProxy() 创建代理对象1.3、JdkDynamicAopProxy#invoke 代理逻辑1.3.1、advised.getInterceptorsAndDynamicInterceptionAdvice() 匹配添加的advisor并转化成所需…

集群基础3——haproxy负载均衡apache

文章目录 一、环境说明二、安装配置httpd三、安装配置haproxy四、验证http负载均衡五、配置https负载均衡六、haproxy网页监控6.1 监控参数详解6.2 页面操作 一、环境说明 使用haproxy对apache进行负载均衡。 主机IP角色安装服务真实IP&#xff1a;192.168.161.129VIP&#xff…

通识强化学习,初步了解强化学习的运行规则和估值方法

1.强化学习的发展及应用现状 1.1.强化学习的由来 目前&#xff0c;大家认为强化学习&#xff08;Reinforcement Learning, RL&#xff09;的来源与两个领域密切相关&#xff1a;即心理学的动物试错学习和最优控制的优化理论。 这里都是有相应的共性的&#xff0c;在environme…

PostgreSQL MVCC的弊端优化方案

我们之前的博客文章“我们最讨厌的 PostgreSQL 部分”讨论了大家最喜欢的 DBMS 多版本并发控制 (MVCC) 实现所带来的问题。其中包括版本复制、表膨胀、索引维护和真空管理。本文将探讨针对每个问题优化 PostgreSQL 的方法。 尽管 PostgreSQL 的 MVCC 实现是 Oracle 和 MySQL 等…

java每日一题:HashMap的工作原理

面试官&#xff1a;欢迎参加我们的面试。请你解释一下Java中HashMap的工作原理。&#x1f60a; 面试者&#xff1a;HashMap是一种基于哈希表的数据结构&#xff0c;它可以存储键值对。在HashMap内部&#xff0c;使用一个数组来存储数据&#xff0c;数组中的每个位置被称为桶&a…

生信分析案例 Python简明教程 | 视频11

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

C语言之每日一题——杨氏矩阵

今天分享的是杨氏矩阵&#xff0c;题目不是特别难&#xff0c;但是是一道比较考验你对杨氏矩阵的理解&#xff0c;要是你不知道杨氏矩阵的话&#xff0c;那你这道题目就无从下手 杨氏矩阵我们可以这样理解&#xff0c;首先矩阵二字证明他是一个长方形型或者正方形的数组&#x…

【HarmonyOS】元服务隐私协议开发指导样例

【关键字】 隐私、弹窗、元服务、协议 【介绍】 每个元服务必须提供隐私声明&#xff0c;否则将导致提交元服务发布上架时&#xff0c;审核无法通过。隐私声明的具体要求请参见隐私声明规范。用户使用元服务前&#xff0c;必须引导其了解隐私声明信息&#xff0c;获取用户授权…

3.SpringBoot 返回Html界面

1.添加依赖spring-boot-starter-web <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>2.创建Html界面 在Resources/static 文件夹下面建立对应的html&#xff0c…

【亮点回顾】第四届国有企业数智化采购与智慧供应链论坛

7月12日&#xff0c;由中国物流与采购联合会主办、北京筑龙承办的“第四届国有企业数智化采购与智慧供应链论坛”在北京市盛大举行。本届论坛以“数智赋能创新发展”为主题&#xff0c;立足于国有企业采购领域发展前沿&#xff0c;深度聚焦国有企业如何在数字经济发展中发挥引领…