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

深入解析浏览器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. 通知客户端保存Cookieresp.addCookie(cookie1);//1. 创建cookie对象Cookie cookie2 = new Cookie("key5","value5");//2. 通知客户端保存Cookieresp.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,说明赋过值,也就是找到了需要的Cookieif (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" ); // ===>>>>  /工程路径/abcresp.addCookie(cookie);resp.getWriter().write("创建了一个带有Path路径的Cookie");}

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

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

<%--Created by IntelliJ IDEA.User: HeyDate: 2022/4/10Time: 19:55To 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.hqwc.cn/news/23164.html

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

相关文章

Linux学习之环境变量

环境变量是每个Shell打开就能获取到的变量&#xff0c;即一打开终端就已经初始化的变量。set、env和declare都可以查看变量的值。按照可以查看信息的范围从小到大是env<set<declare。 env只能显示全局变量。 set可以输出所有的变量&#xff0c;包括全局变量和局部变量。…

软考高级架构师笔记-9系统架构

目录 1. 前文回顾 & 考情分析2. 软件架构概述3. 软件架构风格3.1 层次架构风格3.2 面向服务架构风格4. 软件架构复用5. 特定领域软件体系结构DSSA6. ABSD7. 质量属性8. 架构评估9 结语1. 前文回顾 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师…

IDEA项目报错随笔记录

文章目录 1. 无效的源发行版: 172. java: 无法访问org.springframework.boot.SpringApplication3. java: 程序包org.junit.jupiter.api不存在4. SpringbootTest注解爆红5. maven命令安装本地jar包报错&#xff1a;[拒绝访问]5. maven命令安装本地jar包报错&#xff1a;Unknown …

Kafka 概述、Filebeat+Kafka+ELK

Kafka 概述、FilebeatKafkaELK 一、为什么需要消息队列&#xff08;MQ&#xff09;1、使用消息队列的好处2、消息队列的两种模式 二、Kafka 定义1、Kafka 简介2、Kafka 的特性3、Kafka 系统架构 三、部署 kafka 集群1.下载安装包2.安装 Kafka3.Kafka 命令行操作 四、Kafka 架构…

吴恩达机器学习2022-Jupyter-机器学习实例

1 可选实验: 特征工程和多项式回归 1.1 目标 在这个实验室里: 探索特征工程和多项式回归&#xff0c;它可以让你使用线性回归机制来适应非常复杂&#xff0c;甚至非常非线性的函数。 1.2 工具 您将利用在以前的实验中开发的函数以及matplotlib和NumPy。 2 特征工程与多项式…

使用Gradio库进行交互式数据可视化:Timeseries模块介绍

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

【Hippo4j监控Web容器Tomcat线程池】

&#x1f680; 线程池管理工具-Hippo4j &#x1f680; &#x1f332; AI工具、AI绘图、AI专栏 &#x1f340; &#x1f332; 如果你想学到最前沿、最火爆的技术&#xff0c;赶快加入吧✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域优质创作者&#…

traceId跟踪请求全流程日志

一个系统被拆分成N多个模块&#xff0c;这些模块负责不同的功能&#xff0c;组合成一套系统&#xff0c;最终可以提供丰富的功能。在这种分布式架构中&#xff0c;一次请求往往需要涉及到多个服务&#xff0c;如下图&#xff1a; 服务之间的调用错综复杂&#xff0c;对于维护的…

JVM系列(6)——类加载器详解双亲委派

一、类加载器 类加载器是一个负责加载类的对象&#xff0c;用于实现类加载过程中的加载这一步。 主要作用就是加载 Java 类的字节码&#xff08; .class 文件&#xff09;到 JVM 中&#xff08;在内存中生成一个代表该类的 Class 对象&#xff09;。 加载过程可以看 JVM系列&a…

《面试1v1》Kafka基础

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

RabbitMQ之交换机

RabbitMQ之交换机 1. Exchanges1.1 Exchanges 概念1.2 Exchanges 的类型1.3 无名 exchange 2. 临时队列3. 绑定&#xff08;bindings&#xff09;4. Fanout4.1 Fanout 介绍4.2 Fanout 实战 5. Direct exchange5.1 Direct exchange 介绍5.2 多重绑定5.3 实战 6. Topics6.1 之前类…

Python(十二)常见的数据类型

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…