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来开展产品研发与产品管理工作,应该基于哪些基本思想或原则?市场导向、客户…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...