Java Web 之 Cookie 详解

在 JavaWeb 开发中,Cookie 就像网站给浏览器贴的小纸条,用于记录一些用户信息或状态,方便下次访问时识别用户身份或进行个性化服务。

也可以这么理解:

场景一:想象一下,你去一家咖啡店,店员认出你并说:“老样子吗?” 你点点头,一杯熟悉的拿铁就做好了。这就是 Cookie 的魅力,它让网站记住你的喜好,提供更个性化的服务。

场景二:你在电商网站登录账号,网站会给你浏览器发送一个 Cookie,记录你的用户名。下次访问时,浏览器自动提交 Cookie,你就不用再次登录了。

一、Cookie 的基础知识

  • 定义: Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据。

  • 作用:

    • 会话状态管理: 例如用户登录信息、购物车内容等。

    • 个性化: 例如用户偏好设置、主题选择等。

    • 跟踪用户行为: 例如记录用户浏览历史、点击广告等(需谨慎使用,注意用户隐私)。

  • 工作原理:

    1. 用户访问网站,服务器创建 Cookie 并将其发送给浏览器。

    2. 浏览器将 Cookie 保存在本地。

    3. 用户再次访问该网站时,浏览器将 Cookie 发送回服务器。

    4. 服务器读取 Cookie 信息,识别用户或获取相关数据。

二、Cookie 的本质

  • 客户端存储: Cookie 是由服务器生成的一段文本信息,发送到浏览器,并由浏览器保存在用户本地计算机上的一个小文本文件。

  • 键值对形式: Cookie 以键值对的形式存储数据,例如 username=John。

  • 域名关联: 每个 Cookie 都与特定的域名相关联,浏览器只会将 Cookie 发送回创建它的域名下的服务器。

  • 生命周期: Cookie 可以设置不同的生命周期:

    • 会话 Cookie: 浏览器关闭后自动删除,通常用于存储临时数据,例如购物车信息。

    • 持久 Cookie: 设置了过期时间,在过期时间之前一直有效,即使浏览器关闭。

  • 应用场景:

                1.会话管理 (Session Management): 存储用户登录状态、购物车内容等临时数据。

                2.个性化 (Personalization): 记住用户偏好设置,例如语言、主题、网站布局等。

                3.跟踪用户行为 (Tracking User Behavior): 记录用户浏览历史、点击广告等信息 (需谨慎使用,注意用户隐私)。

三、Cookie 的工作原理

  1. 发送 Cookie: 当你访问一个网站时,服务器会生成一个 Cookie 并发送给你的浏览器。

  2. 存储 Cookie: 浏览器将 Cookie 保存到你的电脑里,就像把小纸条放进口袋。

  3. 提交 Cookie: 当你再次访问同一个网站时,浏览器会自动把保存的 Cookie 发送回去。

  4. 读取 Cookie: 网站读取 Cookie 中的信息,识别你的身份或偏好,并提供相应服务。

四、Java Servlet API 中的 Cookie 操作

1. 创建 Cookie 对象:

Cookie cookie = new Cookie("cookieName", "cookieValue");

2. 设置 Cookie 属性:

  • 最大生存时间 (Max-Age): cookie.setMaxAge(int seconds);

    • 单位为秒。

    • 正数:Cookie 将在指定时间后过期。

    • 负数:Cookie 会话结束后立即过期(默认行为)。

    • 零:删除 Cookie。

  • 路径 (Path): cookie.setPath(String path);

    • 指定 Cookie 在哪个路径下有效,默认为创建 Cookie 的路径及其子路径。

    • 例如,如果设置为 /app,则只有访问 /app 或其子路径 (如 /app/products) 的请求才会携带该 Cookie。

  • 域名 (Domain): cookie.setDomain(String domain);

    • 指定 Cookie 在哪个域名下有效,默认为创建 Cookie 的域名及其子域名。

    • 例如,如果设置为 example.com,则 example.com、 api.example.com 和 www.example.com 下的所有请求都可以访问该 Cookie。

  • 安全属性 (Secure): cookie.setSecure(boolean flag);

    • true:仅通过 HTTPS 连接传输 Cookie,提高安全性。

    • false:HTTP 和 HTTPS 连接都可以传输 Cookie(默认行为)。

  • HttpOnly 属性: cookie.setHttpOnly(boolean flag);

    • true:Cookie 只能通过 HTTP(S) 请求访问,JavaScript 代码无法读取或修改,增强安全性。

    • false:JavaScript 代码可以访问 Cookie(默认行为)。

3. 将 Cookie 添加到响应:

response.addCookie(cookie);

4. 从请求中获取 Cookie:

Cookie[] cookies = request.getCookies();
if (cookies != null) {for (Cookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();// ... 处理 Cookie 数据}
}

五、使用 Cookie 的示例

以下是一个简单的例子,演示了如何使用 Cookie 记录用户上次访问时间:

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;public class CookieServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取 CookieString lastVisitTime = null;Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {if ("lastVisit".equals(cookie.getName())) {lastVisitTime = cookie.getValue();break;}}}// 显示上次访问时间if (lastVisitTime != null) {response.getWriter().println("上次访问时间: " + lastVisitTime);} else {response.getWriter().println("欢迎首次访问!");}// 创建新的 Cookie 记录当前时间SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String currentTime = sdf.format(new Date());Cookie cookie = new Cookie("lastVisit", currentTime);cookie.setMaxAge(60 * 60 * 24); // 设置 Cookie 有效期为 1 天response.addCookie(cookie);}
}

六、Cookie 的安全性

  • Cookie 存储在客户端,容易被窃取或篡改,因此不要在 Cookie 中存储敏感信息,例如密码、信用卡号等。

  • 可以使用 HTTPS 协议来保护 Cookie 在传输过程中的安全。

  • 可以使用 HttpOnly 属性来防止 Cookie 被 JavaScript 脚本访问,从而提高安全性。

七、Cookie 的限制

  • 每个 Cookie 的大小不能超过 4KB。

  • 每个域名下最多只能存储 20 个 Cookie。

  • 浏览器可能会禁用 Cookie,导致无法使用。

八、Cookie 的替代方案

  • Session: 数据存储在服务器端,更安全,但会增加服务器负担。(session知识详解)

  • URL 重写: 将数据附加到 URL 中,但只能传递少量数据,且安全性较低。

  • HTML5 Web Storage: 提供 localStorage 和 sessionStorage 两种机制,可以存储更多数据,且安全性更高。

九、Cookie 的优缺点

优点:

  • 易于实现: 使用 Cookie 不需要复杂的配置,开发人员可以快速地将其集成到 Web 应用中。

  • 减轻服务器负担: Cookie 数据存储在客户端,减少了服务器存储数据的压力。

  • 提升用户体验: 通过记住用户偏好和登录状态,提供更加个性化和便捷的浏览体验。

缺点:

  • 安全性问题: Cookie 存储在客户端,容易被窃取或篡改,不适合存储敏感信息。

  • 大小和数量限制: 每个 Cookie 的大小有限制,每个域名下可存储的 Cookie 数量也有限制。

  • 用户隐私问题: Cookie 可以用于跟踪用户行为,引发隐私问题,需谨慎使用并告知用户。

  • 浏览器兼容性问题: 部分用户可能会禁用浏览器 Cookie 功能,导致应用无法正常工作。

十、总结

Cookie 就像网站和浏览器之间的信使,帮助网站记住你的信息,提供更加个性化的服务。了解 Cookie 的工作原理,可以帮助我们更好地开发 Web 应用,提升用户体验。Cookie 是 Web 开发中常用但需谨慎使用的技术,开发者需要权衡其优缺点,并根据实际情况选择合适的方案。为了确保安全性,应避免在 Cookie 中存储敏感信息,并采取 HTTPS 和 HttpOnly 属性等安全措施。希望对各位看官有所帮助,感谢各位看官的观看,下期见,谢谢~

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

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

相关文章

webpack信息泄露

先看看webpack中文网给出的解释 webpack 是一个模块打包器。它的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换、打包或包裹任何资源。 如果未正确配置,会生成一个.map文件,它包含了原始JavaScript代码的映…

VPN简述

文章目录 VPNVPN基础VPN类型 VPN VPN隧道安全 VPN基础 背景: 在网络传输中,绝大部分数据内容都是明文传输,存在很多安全隐患(窃听、篡改、冒充) 总部、分公司、办事处、出差人员、合作单位等需要访问总部网络资源 Vi…

富格林:警悟可信经验安全投资

富格林指出,黄金具有不错的投资价值,一直以来备受投资者的喜爱,近年来大家也纷纷加入现货黄金市场为己增值财富。但是要为投资安全护航的前提,是需要投资者使用合适可信的方法以及掌握相对应的投资技巧。下面富格林将总结以下可信…

【数学分析笔记】第4章第4节 复合函数求导法则及其应用(1)

4. 微分 4.4 复合函数求导法则及其应用 4.4.1 复合函数求导法则 【定理4.4.1】 u g ( x ) ug(x) ug(x)在 x x 0 xx_0 xx0​可导, g ( x 0 ) u ( 0 ) g(x_0)u(0) g(x0​)u(0), y f ( u ) yf(u) yf(u)在 u u 0 uu_0 uu0​可导,则 y f …

SpringBoot+Redis+RabbitMQ完成增删改查

各部分分工职责 RabbitMQ负责添加、修改、删除的异步操作 Redis负责数据的缓存 RabbitMQ里面角色职责简单描述 RabbitMQ里面有几个角色要先分清以及他们的对应关系: 交换机、队列、路由键 交换机和队列是一对多 队列和路由键是多对多 然后就是消息的发送者&…

课设实验-数据结构-线性表-手机销售

题目&#xff1a; 代码&#xff1a; #include<stdio.h> #include<string.h> #define MaxSize 10 //定义顺序表最大长度 //定义手机结构体类型 typedef struct {char PMod[10];//手机型号int PPri;//价格int PNum;//库存量 }PhoType; //手机类型 //记录手机的顺序…

【HTTP(3)】(状态码,https)

【认识状态码】 状态码最重要的目的&#xff0c;就是反馈给浏览器:这次请求是否成功&#xff0c;若失败&#xff0c;则出现失败原因 常见状态码: 200:OK&#xff0c;表示成功 404:Not Found&#xff0c;浏览器访问的资源在服务器上没有找到 403:Forbidden&#xff0c;访问被…

springboot系列--web相关知识探索三

一、前言 web相关知识探索二中研究了请求是如何映射到具体接口&#xff08;方法&#xff09;中的&#xff0c;本次文章主要研究请求中所带的参数是如何映射到接口参数中的&#xff0c;也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、…

【案例】距离限制模型透明

开发平台&#xff1a;Unity 2023 开发工具&#xff1a;Unity ShaderGraph   一、效果展示 二、路线图 三、案例分析 核心思路&#xff1a;计算算式&#xff1a;透明值 实际距离 / 最大距离 &#xff08;实际距离 ≤ 最大距离&#xff09;   3.1 说明 | 改变 Alpha 值 在 …

计算机组成原理之无符号整数的表示和运算

无符号整数的表示 无符号整数的表示&#xff1a;无符号整数直接使用其二进制形式表示&#xff0c;所有位都是数值位&#xff0c;没有符号位。例如&#xff0c;一个8位的无符号整数可以表示的范围是从0&#xff08;00000000&#xff09;到255&#xff08;11111111&#xff09;。…

stm32f103调试,程序与定时器同步设置

在调试定时器相关代码时&#xff0c;注意到定时器的中断位总是置1&#xff0c;怀疑代码有问题&#xff0c;经过增大定时器的中断时间&#xff0c;发现定时器与代码调试并不同步&#xff0c;这一点对于调试涉及定时器的代码是非常不利的&#xff0c;这里给出keil调试stm32使定时…

自用Proteus(8.15)常用元器件图示和功能介绍(持续更新...)

文章目录 一、 前言二、新建工程&#xff08;以51单片机流水灯为例&#xff09;2.1 打开软件2.2 建立新工程2.3 创建原理图2.4 不创建PCB布版设计2.5 创建成功2.6 添加元器件2.7 原理图放置完成2.8 编写程序&#xff0c;进行仿真2.9 仿真 三、常用元器件图示和功能介绍3.1 元件…

【回眸】Tessy 单元测试软件使用指南(四)常见报错及解决方案与批量初始化的经验

前言 分析时Tessy的报错 1.fatal error: Tricore/Compilers/Compilers.h: No such file or directory 2.error: #error "Compiler unsupported" 3.warning: invalid suffix on literal;C11 requires a space between literal and string macro 4.error: unknown…

螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习01(环境准备)

1 准备工作 由于创建数据中心需要安装很多服务器&#xff0c;这些服务器要耗费很所物理物理计算资源、存储资源、网络资源和软件资源&#xff0c;作为穷学生只有几百块的n手笔记本&#xff0c;不可能买十几台服务器来搭建数据中心&#xff0c;也不愿意跑实验室&#xff0c;想躺…

第十二章--- fixed 和 setprecision 函数、round 函数、进制转换及底层逻辑

1. 保留几位小数 在C中&#xff0c;如果你想要控制输出的小数点后的位数&#xff0c;可以使用<iomanip>头文件提供的fixed和setprecision函数。这里的fixed用于设置浮点数的输出格式为定点表示法&#xff0c;而setprecision(n)则用来指定小数点后保留的位数。具体用法如…

文件上传之%00截断(00截断)以及pikachu靶场

pikachu的文件上传和upload-lab的文件上传 目录 mime type类型 getimagesize 第12关%00截断&#xff0c; 第13关0x00截断 差不多了&#xff0c;今天先学文件上传白名单&#xff0c;在网上看了资料&#xff0c;差不多看懂了&#xff0c;但是还有几个地方需要实验一下&#…

SpringBoot整合异步任务执行

同步任务&#xff1a; 同步任务是在单线程中按顺序执行&#xff0c;每次只有一个任务在执行&#xff0c;不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务&#xff0c;无法同时处理多个任务&#xff0c;响应慢&#xff0c;影响…

C++ 语言特性21 - 别名模板

一&#xff1a;概述 别名模板是 C11 引入的&#xff0c;用于为一个模板类型定义别名&#xff0c;从而简化复杂的模板类型定义。它结合了 using 关键字&#xff0c;可以对模板类型进行重新命名&#xff0c;使代码更加简洁和可读。 1. 作用 定义模板类型的别名。简化复杂的模板类…

VirtualBox+Vagrant快速搭建Centos7系统【最新详细教程】

VirtualBoxVagrant快速搭建Centos7系统 &#x1f4d6;1.安装VirtualBox✅下载VirtualBox✅安装 &#x1f4d6;2.安装Vagrant✅下载Vagrant✅安装 &#x1f4d6;3.搭建Centos7系✅初始化Vagrantfile文件生成✅启动Vagrantfile文件✅解决 vagrant up下载太慢的问题✅配置网络ip地…

Python--加载Hugging Face模型文件异常处理

尝试加载 Hugging Face 模型的配置文件时&#xff0c;无法从 https://huggingface.co 获取所需的 config.json 文件。这个错误通常是由于网络连接问题、访问受限或路径配置错误导致的。让我们一步步分析并解决这个问题。 可能原因及解决方案&#xff1a; 网络连接问题&#xf…