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来开展产品研发与产品管理工作,应该基于哪些基本思想或原则?市场导向、客户…...
如何在算家云搭建MVSEP-MDX23(音频分离)
一、MVSEP-MDX23简介 模型GitHub网址:MVSEP-MDX23-music-separation-model/README.md 在 main ZFTurbo/MVSEP-MDX23-音乐分离模型 GitHub 上 在音视频领域,把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有…...
常用的Java安全框架
Spring Security: 就像Java安全领域的“瑞士军刀”,功能全面且强大。 支持认证、授权、加密、会话管理等安全功能。 与Spring框架无缝集成,使用起来特别方便。 社区活跃,文档丰富,遇到问题容易找到解决方案。 Apach…...
使用 PHP 的 strip_tags函数保护您的应用安全
在现代 web 开发中,处理用户输入是一项常见的任务。然而,用户输入的内容往往包含 HTML 或 PHP 标签,这可能会导致安全漏洞,如跨站脚本攻击(XSS)。为了解决这个问题,PHP 提供了一个非常有用的函数…...
您的计算机已被Lockbit3.0勒索病毒感染?恢复您的数据的方法在这里!
导言 在数字化时代,互联网已成为我们生活、工作和学习中不可或缺的一部分。然而,随着网络技术的飞速发展,网络安全威胁也日益严峻。其中,勒索病毒作为一种极具破坏性的网络攻击手段,正逐渐成为企业和个人面临的重大挑…...
经典sql题(十二)UDTF之Explode炸裂函数
1. EXPLODE: UDTF 函数 1.1 功能说明 EXPLODE 函数 是Hive 中的一种用户定义的表函数(UDTF),用于将数组或映射结构中的复杂的数据结构每个元素拆分为单独的行。这在处理复杂数据时非常有用,尤其是在需要将嵌套数据“打散”以便更…...
【AIGC】ChatGPT提示词解析:如何打造个人IP、CSDN爆款技术文案与高效教案设计
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯打造个人IP爆款文案提示词使用方法 💯CSDN爆款技术文案提示词使用方法 💯高效教案设计提示词使用方法 💯小结 💯前言 在这…...
【Ubuntu】Ubuntu常用命令
文章目录 网卡路由常用命令:编辑文件echo 权限设置gcc编译器: 重启网络服务 sudo service network-manager restart 网卡 #查看网卡信息 ip a #区分光网卡电网卡 sudo lshw -class network -businfo ifconfig ifconfig eth1 192.168.1.12/24 #重启网卡…...
架构设计笔记-5-软件工程基础知识-2
知识要点 构件组装是将库中的构件经适当修改后相互连接,或者将它们与当前开发项目中的软件元素连接,最终构成新的目标软件。 构件组装技术大体可分为: 1. 基于功能的组装技术:基于功能的组装技术采用子程序调用和参数传递的方式将构件组装起来。它要求库中的构件以子程序…...
[网络]抓包工具介绍 tcpdump
一、tcpdump tcpdump是一款基于命令行的网络抓包工具,可以捕获并分析传输到和从网络接口流入和流出的数据包。 1.1 安装 tcpdump 通常已经预装在大多数 Linux 发行版中。如果没有安装,可以使用包管理器 进行安装。例如 Ubuntu,可以使用以下…...
基于STM32和FPGA的射频数据采集系统设计流程
一、项目概述 高速采集射频(RF)信号是一个关键的需求。本文旨在设计一种基于STM32和FPGA的射频数据采集系统,以实现对接收到的射频信号的高精度和高速度的处理。该系统适用于无线通信、信号分析、雷达系统等应用场景。 技术栈关键词&#x…...
公司网站建设案例/网站快速有排名
作业4:一、通配符练习:1、显示/etc目录下,以字母开头,后面跟了一个非字母及其它任意长度任意字符的文件或目录;[rootlocalhost fuboyuan]# ls -l /etc/[[:alpha:]]*[^[:alpha:]]2、显示/usr/share/man目录下࿰…...
沧州哪家做网站好/营销策划方案怎么做
默认插槽: 父组件中:<Category><div>html结构1</div></Category>子组件中:<template><div><!-- 定义插槽 --><slot>插槽默认内容...</slot></div></template>具名插槽&a…...
网站开发架构分类/培训机构
手工合并报表时,经常遇到很多问题,而且效率低下,而专业的合并报表软件只需要几步,就能快速准确汇总各子报表,生成合并的报表并动态展示。尤其是对于财务报表来说,能节省大量手工合并做账的重复做工精力。…...
为了爱我可以做任何事俄剧网站/官网seo
一套完整的WordPress模板应至少具有如下文件: style.css : CSS(样式表)文件index.php : 主页模板archive.php : Archive/Category模板404.php : Not Found 错误页模板comments.php : 留言/回复模板footer.php : Footer模板header.php : Header模板sidebar.php : 侧栏…...
学院的网站建设的er图怎么画/百度网站
公众号关注 “GitHubDaily”设为 “星标”,每天带你逛 GitHub!转自机器之心LaTex 是很多人在写论文时使用的方便工具,但是如何将书本上的公式直接转换为 LaTex 格式呢?近日,一位中国开发者开源了这样一款工具。用户可以…...
http网站跳转怎么做/专业网络推广公司
PDC(专业开发人员会议)一直是由微软的高级开发者和架构师作为参与者,以便了解未来的微软平台和技术,PDC 2010,您将可以获得关于微软下一代云服务、Windows Phone 7、工具和技术、Internet Explorer 9 和游戏平台的第一手内容,PDC …...