Java Web 之 Cookie 详解
在 JavaWeb 开发中,Cookie 就像网站给浏览器贴的小纸条,用于记录一些用户信息或状态,方便下次访问时识别用户身份或进行个性化服务。
也可以这么理解:
场景一:想象一下,你去一家咖啡店,店员认出你并说:“老样子吗?” 你点点头,一杯熟悉的拿铁就做好了。这就是 Cookie 的魅力,它让网站记住你的喜好,提供更个性化的服务。
场景二:你在电商网站登录账号,网站会给你浏览器发送一个 Cookie,记录你的用户名。下次访问时,浏览器自动提交 Cookie,你就不用再次登录了。
一、Cookie 的基础知识
-
定义: Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据。
-
作用:
-
会话状态管理: 例如用户登录信息、购物车内容等。
-
个性化: 例如用户偏好设置、主题选择等。
-
跟踪用户行为: 例如记录用户浏览历史、点击广告等(需谨慎使用,注意用户隐私)。
-
-
工作原理:
-
用户访问网站,服务器创建 Cookie 并将其发送给浏览器。
-
浏览器将 Cookie 保存在本地。
-
用户再次访问该网站时,浏览器将 Cookie 发送回服务器。
-
服务器读取 Cookie 信息,识别用户或获取相关数据。
-
二、Cookie 的本质
-
客户端存储: Cookie 是由服务器生成的一段文本信息,发送到浏览器,并由浏览器保存在用户本地计算机上的一个小文本文件。
-
键值对形式: Cookie 以键值对的形式存储数据,例如 username=John。
-
域名关联: 每个 Cookie 都与特定的域名相关联,浏览器只会将 Cookie 发送回创建它的域名下的服务器。
-
生命周期: Cookie 可以设置不同的生命周期:
-
会话 Cookie: 浏览器关闭后自动删除,通常用于存储临时数据,例如购物车信息。
-
持久 Cookie: 设置了过期时间,在过期时间之前一直有效,即使浏览器关闭。
-
- 应用场景:
1.会话管理 (Session Management): 存储用户登录状态、购物车内容等临时数据。
2.个性化 (Personalization): 记住用户偏好设置,例如语言、主题、网站布局等。
3.跟踪用户行为 (Tracking User Behavior): 记录用户浏览历史、点击广告等信息 (需谨慎使用,注意用户隐私)。
三、Cookie 的工作原理
-
发送 Cookie: 当你访问一个网站时,服务器会生成一个 Cookie 并发送给你的浏览器。
-
存储 Cookie: 浏览器将 Cookie 保存到你的电脑里,就像把小纸条放进口袋。
-
提交 Cookie: 当你再次访问同一个网站时,浏览器会自动把保存的 Cookie 发送回去。
-
读取 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 属性等安全措施。希望对各位看官有所帮助,感谢各位看官的观看,下期见,谢谢~
相关文章:
Java Web 之 Cookie 详解
在 JavaWeb 开发中,Cookie 就像网站给浏览器贴的小纸条,用于记录一些用户信息或状态,方便下次访问时识别用户身份或进行个性化服务。 也可以这么理解: 场景一:想象一下,你去一家咖啡店,店员认…...
linux系统下让.py文件开机自启动
一 创建服务文件 1、打开终端 2、切换到root用户 sudo su3、创建一个新的systemd服务文件 nano /etc/systemd/system/total_test0619.service 4、在服务文件中添加以下内容 [Unit] DescriptionRun total_test0619.py at startup[Service] Typesimple ExecStart/usr/bin/n…...
linux远程桌面:xrdp 安装失败
window 如何远程 Linux 桌面 安装xrdp yum install xrdpsystemctl start xrdp 如果找不到软件包,就安装epel源,最好改成国内镜像的 在 /etc/yum.repos.d/ 下创建epel.repo,内容如下 [epel] nameExtra Packages for Enterprise Linux 7 - $basearch …...
9.30Python基础-元组(补充)、字典、集合
Python元组(tuple)补充 1、元组的不可变性 元组(tuple)是Python中的一种内置数据类型,用于存储不可变的序列。虽然元组本身不可变,但元组内的元素如果是可变对象(如列表)ÿ…...

桥接模式和NET模式的区别
桥接模式和NET模式的区别 NAT模式: NAT:网络地址转换(模式):借助宿主机来上网,没桥接那么麻烦,只用配置DNS即可。 缺点:扎根于宿主机,不能和局域网内其它真实的主机进行…...
Pigar:Python 项目的依赖管理利器
🌟 引言 在Python项目开发过程中,依赖管理是一个不可忽视的环节。一个精确且易于维护的requirements.txt文件对于项目的部署和协作至关重要。今天,我们将介绍一款名为Pigar的自动生成requirements.txt文件的依赖管理工具,它通过一…...

泰勒图 ——基于相关性与标准差的多模型评价指标可视化比较-XGBoost、sklearn
1、基于相关性与标准差的多模型评价指标可视化比较 # 数据读取并分割 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split plt.rcParams[font.family] = Times New Roman plt.rcParams[axes.unic…...

记录|Modbus-TCP产品使用记录【摩通传动】
目录 前言一、摩通传动实验图1.1 配置软件 IO_Studio1.2 测试软件Modbus Poll1.2.1 读写设置测试1.2.2 AI信号的读取 1.3 对应的C#连接Modbus的测试代码如下【自制,仅供参考】1.4 最终实验图 更新时间 前言 参考文章: 自己需要了解和对比某些产品的Modbu…...

工业交换机的RMON
工业交换机在现代网络中扮演着至关重要的角色,它不仅负责数据的高效传输,还具备强大的监控和管理能力。其中,RMON(远程监控)功能使得交换机的性能得以进一步提升,成为网络管理的重要工具。RMON提供了一种先…...
生态遥感数据下载分享
中国土壤湿度/土壤水分数据集(2000-2020) 下载网站:https://poles.tpdc.ac.cn/zh-hans/data/49b22de9-5d85-44f2-a7d5-a1ccd17086d2/#:~:text%E6%88%91%E4%BB%AC%E6%8F%90%E4%BE%9B%E4%BA%86%E4%B8%AD%E5%9B%BD%E8%8C%83 note: The data can …...

ECharts 快速使用
最终效果 使用介绍 echarts图表的绘制,大体分为三步: 根据 DOM实例,通过 echarts.init方法,生成 echarts实例构建 options配置对象,整个echarts的样式,皆有该对象决定最后通过实例.setOption方法…...

进程--消息队列和共享内存
目录 消息队列 创建消息队列 删除消息队列 发送消息和接收 消息队列 消息队列就是一个消息的列表,进程可以在消息队列中添加消息和的读取消息 消息队列具有FIFO的特性,具有无名管道与有名管道各自的优势,可以支持任意两个进程的进程间通讯…...
useCallback()
官网直达:https://zh-hans.react.dev/reference/react/useCallback 点击按钮,子组件会重新渲染 import { memo, useState, useCallback } from react;const Child (props) > {console.log(我是子组件!我在渲染呢!࿰…...
Python面试题精选及解析--第二篇
在Python的面试中,除了基础语法和常用库的知识外,面试官往往还会通过一系列的问题来考察应聘者的逻辑思维、问题解决能力以及项目经验。以下是一些精心挑选的Python面试题及其详细答案,旨在帮助求职者更好地准备面试。 面试题一:…...

Linux操作常用问题
目录 Ubuntu操作问题vi编辑方向键键盘乱码回退键不能使用的问题解决问题的方法 Ubuntu操作问题 vi编辑方向键键盘乱码回退键不能使用的问题 编辑/etc/systemd/resolved.conf文件来修改DNS,结果编辑时键盘乱码,按下方向键会出现ABCD,且回退键…...
汽车发动机系统(ems)详细解析
汽车发动机系统EMS,即Engine-Management-System(发动机管理系统),是现代汽车电子控制技术的重要组成部分。以下是对汽车发动机系统EMS的详细解析,内容将涵盖其定义、工作原理、主要组成、功能特点、技术发展以及市场应…...

对比学习训练是如何进行的
对比学习(Contrastive Learning)是一种自监督学习的方法,旨在通过拉近相似样本的表示、拉远不相似样本的表示来学习特征表示。在训练过程中,模型并不依赖标签,而是通过样本之间的相似性进行学习。以下是对比学习的基本…...

React 生命周期 - useEffect 介绍
在 React 中,useEffect 钩子可以被看作是函数组件中的一种副作用管理工具,它的行为可以模拟类组件中的不同生命周期方法。useEffect 的执行时机取决于其依赖项数组(第二个参数)的设置方式。 根据 useEffect 的使用方式,…...
OpenCV-指纹识别
文章目录 一、意义二、代码实现1.计算匹配点2.获取编号3.获取姓名4.主函数 三、总结 一、意义 使用OpenCV进行指纹识别是一个复杂且挑战性的任务,因为指纹识别通常需要高精度的特征提取和匹配算法。虽然OpenCV提供了多种图像处理和计算机视觉的工具,但直…...
IPD的核心思想
IPD是一套领先的、成熟的研发管理思想、模式和方法。它是根据大量成功的研发管理实践总结出来的,并被大量实践证明的高效的产品研发模式。 那么,按照IPD来开展产品研发与产品管理工作,应该基于哪些基本思想或原则?市场导向、客户…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...