Servlet笔记(9):Cookie处理
一、Cookies处理
1、Cookies概念
Cookies是存储在客户端计算机上的文本文件,并保留各种跟踪信息。
识别返回用户的三个步骤
- 服务器脚本向浏览器发送一组Cookies。例如姓名、年龄或识别号码等。
- 浏览器将这些信息存储在本地计算机上。
- 当下一次浏览器向Web服务器发送任何请求时,浏览器会把这些Cookies信息发送到服务器,服务器将使用这些来识别用户。
中文的编码与解码
String str = java.net.URLEncoder.encode("中文"); //编码
String str = java.net.URLDecoder.decode("编码后的字符串"); // 解码
2、Cookies 剖析
Set-Cookie头包含一个键值对、一个有效期【expires】、一个路径【文件路径】和一个域【主机地址】
获取Cookies
Cookie[] HttpServletRequest.getCookies();
3、Cookies操作方法
| 序号 | 方法 & 描述 |
|---|---|
| 1 | public void setDomain(String pattern) 该方法设置 cookie 适用的域,例如 w3cschool.cn。 |
| 2 | public String getDomain() 该方法获取 cookie 适用的域,例如 w3cschool.cn。 |
| 3 | public void setMaxAge(int expiry) 该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。 |
| 4 | public int getMaxAge() 该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。 |
| 5 | public String getName() 该方法返回 cookie 的名称。名称在创建后不能改变。 |
| 6 | public void setValue(String newValue) 该方法设置与 cookie 关联的值。 |
| 7 | public String getValue() 该方法获取与 cookie 关联的值。 |
| 8 | public void setPath(String uri) 该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。 |
| 9 | public String getPath() 该方法获取 cookie 适用的路径。 |
| 10 | public void setSecure(boolean flag) 该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。 |
| 11 | public void setComment(String purpose) 该方法规定了描述 cookie 目的的注释。该注释在浏览器向用户呈现 cookie 时非常有用。 |
| 12 | public String getComment() 该方法返回了描述 cookie 目的的注释,如果 cookie 没有注释则返回 null。 |
4、设置Cookies的步骤
(1) 创建Cookie对象
Cookie cookie = new Cookie("key","value");
key与value不能包含以下字符
[ ] ( ) = , " / ? @ : ;
(2)设置最大生存周期
使用 setMaxAge 方法来指定 cookie 能够保持有效的时间(以秒为单位)。
cookie.setMaxAge(60*60*24);
(3)发送Cookie到HTTP响应头
response.addCookie(cookie);
5、Cookie实例
HelloForm.java
/*** 包名:SelectTest* 作者:章恩光* 时间:2023/2/24 1:38 周五*/import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;public class HelloForm extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie firstName = new Cookie("first_name",req.getParameter("first_name"));Cookie lastName = new Cookie("last_name",req.getParameter("last_name"));firstName.setMaxAge(60*60*24);lastName.setMaxAge(60*60*24);resp.addCookie(firstName);resp.addCookie(lastName);resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();String title = "设置 Cookies 实例";String docType ="<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#f0f0f0\">\n" +"<h1 align=\"center\">" + title + "</h1>\n" +"<ul>\n" +" <li><b>名字</b>:"+ req.getParameter("first_name") + "\n" +" <li><b>姓氏</b>:"+ req.getParameter("last_name") + "\n" +"</ul>\n" +"</body></html>");}
}
ReadForm.java
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;/*** 包名:SelectTest* 作者:章恩光* 时间:2023/2/24 19:11 周五*/
public class ReadForm extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = null;Cookie[] cookies = null;cookies = req.getCookies();resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();String title = "Reading Cookies Example";String docType ="<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//zh\">\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#f0f0f0\">\n" );if( cookies != null ) {out.println("<h2>查找 Cookies 名称和值</h2>");for (int i = 0; i < cookies.length; i++){cookie = cookies[i];out.print("名称:" + cookie.getName() + ",");out.print("值:" + cookie.getValue()+" <br/>");}} else {out.println("<h2 class=\"tutheader\">未找到 Cookies</h2>");}out.println("</body>");out.println("</html>");}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><servlet><servlet-name>HelloForm</servlet-name><servlet-class>HelloForm</servlet-class></servlet><servlet-mapping><servlet-name>HelloForm</servlet-name><url-pattern>/HelloForm</url-pattern></servlet-mapping><servlet><servlet-name>ReadForm</servlet-name><servlet-class>ReadForm</servlet-class></servlet><servlet-mapping><servlet-name>ReadForm</servlet-name><url-pattern>/ReadForm</url-pattern></servlet-mapping>
</web-app>
效果图



6、删除Cookies
步骤:
- 读取现有cookie,并创建Cookie对象
- 使用setMaxAge()方法设置cookie周期为0
- 添加cookie添加到响应头
实例:
// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;// 扩展 HttpServlet 类
public class DeleteCookies extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Cookie cookie = null;Cookie[] cookies = null;// 获取与该域相关的 Cookies 的数组cookies = request.getCookies();// 设置响应内容类型response.setContentType("text/html");PrintWriter out = response.getWriter();String title = "Delete Cookies Example";String docType = "<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";out.println(docType +"<html>\n" +"<head><title>" + title + "</title></head>\n" +"<body bgcolor=\"#f0f0f0\">\n" );if( cookies != null ){out.println("<h2>Cookies 名称和值</h2>");for (int i = 0; i < cookies.length; i++){cookie = cookies[i];//会话中。firstname不一致时删除cookie,并添加删除的cookie到响应头,以修改浏览器中的cookie状态if((cookie.getName()).compareTo("first_name") == 0 ){cookie.setMaxAge(0);response.addCookie(cookie);out.print("已删除的 cookie:" + cookie.getName() + "<br/>");}out.print("名称:" + cookie.getName() + ",");out.print("值:" + cookie.getValue()+" <br/>");}}else{out.println("<h2 class="tutheader">No cookies founds</h2>");}out.println("</body>");out.println("</html>");}
}
相关文章:
Servlet笔记(9):Cookie处理
一、Cookies处理 1、Cookies概念 Cookies是存储在客户端计算机上的文本文件,并保留各种跟踪信息。 识别返回用户的三个步骤 服务器脚本向浏览器发送一组Cookies。例如姓名、年龄或识别号码等。浏览器将这些信息存储在本地计算机上。当下一次浏览器向Web服务器发送…...
骨传导耳机是怎么传声的,选择骨传导耳机的时候需要注意什么?
骨传导耳机之所以能够成为当下最火的耳机,骨传导技术将声音转化为震动感,通过骨头进行传播,不会堵塞耳朵,就不会影响到周围环境音。这种技术也让骨传导耳机比传统入耳式耳机更安全,无需入耳式设计,避免了…...
达梦数据库DSC集群部署
一、概述 1.1 DSC 集群架构 1.2 架构说明 1、DMDSC 集群是一个多实例、单数据库的系统。 多个数据库实例可以同时访问、修改同一个数据库的数据。 2、数据文件、控制文件在集群系统中只有一份,不论有几个节点,这些节点都平等地使用这些文件, 这些文件保存在共享存储上。 3…...
java 系列之Mybatis
java 系列文章 文章目录java 系列文章前言一、Mybatis 入门1.1 认识 框架(了解)1.2 认识 ORM(要知道)1.3 认识 Mybatis(要知道)二、Mybatis 使用2.1 创建maven项目并导入依赖2.2 准备数据库,包和…...
OBS 进阶 之 摄像头操作
目录 一、摄像头 1、win-dshow插件中,摄像头枚举操作 1)、视频源ID 2)、注册视频源信息...
Linux操作系统基础知识命令参数详解
Linux操作系统 RAID分组 RAID JBOD RAID JBOD的意思是Just a Bunch Of Disks,是将多块硬盘串联起来组成一个大的存储设备,从某种意义上说这种类型不被算作RAID,在维基百科里JBOD同时也被归入非RAID架构。RAID JBOD将所有的磁盘串联成一个单…...
Rust中一些K/V存储引擎
K/V存储引擎的由来可以追溯到20世纪70年代的Berkley DB,而近年来,随着互联网应用的发展,KV存储引擎因其简单高效、可扩展性和适合缓存应用等特点,在分布式存储领域得到了广泛应用。而使用Rust编写KV存储具有内存安全、高性能、并发…...
202302-第四周资讯
山川软件愿为您提供最优质的服务。 您的每一个疑问都会被认真对待,您的每一个建议都将都会仔细思考。 我们希望人人都能分析大数据,人人都能搭建应用。 因此我们将不断完善我们的DEMO、文档、以及视频,期望能在最大程度上快速帮助用户快速…...
九方财富冲刺上市:付费用户开始减少,退款金额飙升至4.9亿元
日前,九方财富控股有限公司(下称“九方财富”)通过港交所上市聆讯,并披露了聆讯后招股书。据贝多财经了解,九方财富最早于2021年8月31日在港交所递表,后在2022年3月、9月分别进行了更新。 据每日经济新闻报…...
SSM+HTML搭建(小白教学)
最近做项目,觉得还是有意义记录以下前后端框架是怎么搭建的,今天给大家介绍介绍SSM:SpringBootSpringMVCMyBatis后端搭建:SpringBoot快速搭建的网站(Spring Initializr)选择创建之后,会下载到一个zip压缩包,对压缩包进行解压(包地址一般选择后端项目的放的文件夹中)用idea打开项…...
【知识蒸馏】知识蒸馏(Knowledge Distillation)技术详解
参考论文:Knowledge Distillation: A Survey 1.前言 近年来,深度学习在学术界和工业界取得了巨大的成功,根本原因在于其可拓展性和编码大规模数据的能力。但是,深度学习的主要挑战在于,受限制于资源容量࿰…...
公司新招了个腾讯5年经验的测试员,让我见识到什么才是真正的测试天花板····
5年测试,应该是能达到资深测试的水准,即不仅能熟练地开发业务,而且还能熟悉项目开发,测试,调试和发布的流程,而且还应该能全面掌握数据库等方面的技能,如果技能再高些的话,甚至熟悉分…...
(一维、二维)数组传参,(一级、二级)指针传参【含样例分析,新手易懂】
目录数组传参一维数组传参二维数组传参指针传参一级指针传参二级指针传参我们在写代码的时候难免要把数组或者指针传给函数,那函数的参数该如何设计呢? 数组传参 一维数组传参 我们首先来看下面代码的几个例子: #include <stdio.h>…...
for循环中的setTimeout以及var let作用域
看了很多解释,感觉都不好理解。这个文章是我自己的理解,可以做个参考,如果我理解的不对,欢迎在评论区指正: var:使用var声明的变量具有全局作用域 (循环中每次声明的是同一个变量) l…...
有限差分法求解不可压NS方程
网上关于有限差分法解NS方程的程序实现不尽完备,这里是一些补充注解 现有的优秀资料 理论向 【1】如何从物理意义上理解NS方程? - 知乎 【2】NS方程数值解法:投影法的简单应用 - 知乎 【3】[计算流体力学] NS 方程的速度压力法差分格式_…...
Android入门第66天-使用AOP
开篇这篇恐怕又是一篇补足网上超9成关于这个领域实际都是错的、用不起来的一个知识点了。网上太多太多教程和案例用的是一个叫hujiang的AOP组件-com.hujiang.aspectjx:gradle-android-plugin-aspectjx。首先这些错的文章我不知道是怎么来的,其次那些案例真的运行成功…...
pl/sql篇之触发器
简述本文將具体简述触发器的语法,触发条件及其适用场景,希望对读者理解,使用触发器能起到作用。触发器的定位触发器是数据库独立编译,存储的对象,是数据库重要的技术。和函数不同,触发器的执行是主动的&…...
黑马《数据结构与算法2023版》正式发布
有人的地方就有江湖。 在“程序开发”的江湖之中,各种技术流派风起云涌,变幻莫测,每一位IT侠客,对“技术秘籍”的追求和探索也从未停止过。 要论开发技术哪家强,可谓众说纷纭。但长久以来,确有一技&#…...
Spring的创建和使用
目录 创建Spring项目 步骤 1)使用Maven的方式创建Spring项目 2)添加Spring依赖 3)创建启动类 存Bean对象 1.创建Bean对象 2.将Bean注册到Spring中 取Bean对象并使用 步骤 1.先得到Spring上下文对象 2.从Spring中获取Bean对象 3.使用Bean ApplicationContext VS Bea…...
如何实现外网跨网远程控制内网计算机?快解析来解决
远程控制,是指管理人员在异地通过计算机网络异地拨号或双方都接入Internet等手段,连通需被控制的计算机,将被控计算机的桌面环境显示到自己的计算机上,通过本地计算机对远方计算机进行配置、软件安装程序、修改等工作。通俗来讲&a…...
vLLM-v0.11.0保姆级部署教程:5分钟搞定LLaMA/Qwen高速推理服务
vLLM-v0.11.0保姆级部署教程:5分钟搞定LLaMA/Qwen高速推理服务 你是不是也遇到过这样的烦恼?好不容易搞到一个不错的开源大模型,比如LLaMA或者Qwen,想部署成服务试试效果,结果发现速度慢得像蜗牛,内存占用…...
别再只盯着Logits了!聊聊知识蒸馏里‘注意力图’那点事儿(从AT论文到理解误区)
注意力蒸馏:超越Logits的知识迁移新范式 在深度学习模型压缩领域,知识蒸馏早已不是新鲜话题。大多数实践者会条件反射地想到教师网络输出的logits或中间层特征——这些确实是最直观的知识载体。但当我们把目光投向人类的学习过程时,会发现一个…...
别再傻傻编译整个内核了!香橙派3B (rk3566) 快速修改和测试设备树节点的正确姿势
香橙派3B设备树节点高效调试指南:从编译优化到实战技巧 每次修改设备树节点都要重新编译整个内核?等待十几分钟甚至更久只为了验证一个小改动?对于香橙派3B(rk3566)开发者来说,这种低效的工作流程已经成为过去。本文将揭示一套经…...
小白也能懂:雪女-斗罗大陆-造相Z-Turbo文生图模型使用详解
小白也能懂:雪女-斗罗大陆-造相Z-Turbo文生图模型使用详解 1. 模型介绍 1.1 什么是雪女-斗罗大陆-造相Z-Turbo 雪女-斗罗大陆-造相Z-Turbo是一款专门用于生成《斗罗大陆》风格图片的AI模型,特别擅长创作与"雪女"角色相关的精美图像。这个模…...
WarcraftHelper解决方案:魔兽争霸3跨系统优化指南
WarcraftHelper解决方案:魔兽争霸3跨系统优化指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为经典的即时战略游戏&#…...
别再死记硬背了!用Verilog手写一个四位加减法器,帮你彻底搞懂补码和逻辑门
从逻辑门到补码运算:Verilog四位加减法器的硬件思维解密 记得第一次在《数字逻辑》课上听到"补码"这个概念时,我和大多数同学一样满脸困惑——为什么计算机要用这么绕的方式处理负数?直到亲手用Verilog实现了一个四位加减法器&…...
手柄不兼容PC游戏?试试ViGEmBus的虚拟控制器仿真技术
手柄不兼容PC游戏?试试ViGEmBus的虚拟控制器仿真技术 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否遇到过这样的情况:新买的…...
Next.js API路由的正确使用姿势
在使用Next.js开发应用时,API路由的配置和使用是非常重要的一部分。尤其是当我们从客户端组件中请求API时,如果不正确配置,可能会遇到一些常见的错误,比如404错误。本文将通过实例详细解释如何在Next.js中正确配置和使用API路由。 问题背景 假设你正在使用Next.js 14.2.3…...
C/C++ 调用约定与 Windows GDI 位图操作实用解析
stdcall调用约定 stdcall很多时候被称为pascal调用约定,因为pascal是早期很常见的一种教学用计算机程序设计语言,其语法严谨,使用的函数调用约定就是stdcall。在Microsoft C系列的C/C编译器中,常常用PASCAL宏来声明这个调用约…...
MIT-BEVFusion LiDAR Encoder 保姆级拆解:从点云到BEV特征图,手把手带你过一遍代码
MIT-BEVFusion LiDAR Encoder 深度解析:从点云到BEV特征图的完整实现路径 当自动驾驶系统需要理解周围环境时,LiDAR点云数据的高效处理成为关键挑战。MIT-BEVFusion框架中的LiDAR编码器模块,通过创新的稀疏卷积架构,将无序的三维点…...
