cookie 生命周期和cookie有效路径超级详细讲解
wxin55 2024-11-01 14:29 9 浏览 0 评论
cookie 生命周期和cookie有效路径超级详细讲解
cookie 生命周期
介绍
- Cookie 的生命周期指的是如何管理 Cookie 什么时候被销毁(删除)
- setMaxAge()
● 正数,表示在指定的秒数后过期
? ● 负数,表示浏览器关闭,Cookie 就会被删除(默认值是-1)
? ● 0,表示马上删除 Cookie
代码示例
java
复制代码
publicclassCookieLiveextendsHttpServlet {protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { System.out.println("CookieLive 被调用...");//演示创建一个cookie , 生命周期为 60sCookiecookie=newCookie("job", "java");//解读:// 1. 从创建该cookie开始计时, 60秒后无效// 2. 浏览器来根据创建的时间,计时到60s秒,就认为该cookie无效// 3. 如果该cookie无效,那么浏览器在发出http请求时,就不在携带该cookie cookie.setMaxAge(60);//将cookie保存到浏览器 response.addCookie(cookie);//演示如何删除一个cookie, 比如删除username//1 先得到username cookie Cookie[] cookies = request.getCookies();CookieusernameCookie= CookieUtils.readCookieByName("username", cookies);if(usernameCookie != null) {//2. 将其生命周期设置为0 usernameCookie.setMaxAge(0);//3. 重新保存该cookie, 因为你将其生命周期设置0, 就等价于让浏览器删除该cookie//4. 说明:该cookie会被浏览器直接删除// 返回一个Set-Cookie: xxxxx => 一会抓包.// Set-Cookie: username=tom; Expires=Thu, 01-Jan-1970 00:00:10 GMT response.addCookie(usernameCookie);//返回一个Set-Cookie: xxxxx => 一会抓包. }else{ System.out.println("没有找到该cookie, 无法删除..."); }/*********************** * 默认的会话级别的 Cookie [即浏览器关闭就销毁了] * 前面我们讲课时,都是默认会话级别的生命周期 ***********************/Cookiecookie3=newCookie("dkey", "dkey_value");/** * 解读 setMaxAge源码 * public void setMaxAge(int expiry) { * this.maxAge = expiry; * } * private int maxAge = -1; 默认就是-1 *///cookie.setMaxAge(-1);//设置存活时间 response.addCookie(cookie3);// 给浏览器返回信息 response.setContentType("text/html;charset=utf-8");PrintWriterwriter= response.getWriter(); writer.println("<h1>设置cookie生命周期</h1>"); writer.flush(); writer.close(); }protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doPost(request, response); }}
完成测试 , 注意抓包看数据
cookie 有效路径
有效路径规则
- Cookie 有效路径 Path 的设置
- Cookie 的 path 属性可以有效的过滤哪些 Cookie 可以发送给服务器。哪些不发。path属性是通过请求的地址来进行有效的过滤
规则如下:
cookie1.setPath = /工程路径
cookie2.setPath = /工程路径/aaa
请求地址: http://ip:端口/工程路径/资源
cookie1 会发给服务器
cookie2 不会发给服务器
请求地址: http://ip:端口/工程路径/aaa/资源
cookie1 会发给服务器
cookie2 会发给服务器
代码示例
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;publicclassCookiePathServletextendsHttpServlet {protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doGet(request, response); }protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Cookiecookie=newCookie("keyPath1", "keyPath1Value");// request.getContextPath() + "/aaa" 得到 /工程路径/aaa cookie.setPath(request.getContextPath() + "/aaa");Cookiecookie2=newCookie("keyPath2", "keyPath2Value"); cookie2.setPath(request.getContextPath()); response.addCookie(cookie); response.addCookie(cookie2); response.setContentType("text/html;charset=utf-8"); response.getWriter().write("<h1>创建 Cookie keyPath1 路径 /工程路径/aaa </h1>"); response.getWriter().write("<h1>创建 Cookie keyPath2 路径 /工程路径 </h1>"); }}
完成测试 , 注意抓包看创建 Cookie 时,返回的数据
完成测试 , 注意抓包看读取 Cookie 时,返回的数据
代码示例
需求: 完成自动填写登录账户应用案例 , 如果用户登录成功,则下次登录自动填写登录 账户
html页面
html
复制代码
<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>登录页面</title></head><body><h1>用户登录界面</h1><formaction="#"method="post"> u:<inputtype="text"name="username"><br/> p:<inputtype="password"name="pwd"><br/><inputtype="submit"value="登录"></form></body></html>
创建LoginServlet
java
复制代码
publicclassLoginServletextendsHttpServlet {protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//System.out.println("LoginServlet 被调用...~~~");//1. 接收表单提交用户名和密码Stringusername= request.getParameter("username");Stringpwd= request.getParameter("pwd"); response.setContentType("text/html;charset=utf-8");PrintWriterwriter= response.getWriter();//2. 判断是否合法if ("xxxx".equals(username) && "123456".equals(pwd)) {//将登录成功的用户名,以cookie的形式,保存到浏览器CookieloginuserCookie=newCookie("loginuser", username);//设置该cookie生命周期 loginuserCookie.setMaxAge(3600 * 24 * 3); response.addCookie(loginuserCookie);//合法 writer.println("<h1>登录OK</h1>"); } else {//不合法 writer.println("<h1>登录失败</h1>"); } writer.flush(); writer.close(); }protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doPost(request, response); }}
Cookie 注意事项和细节
- 一个 Cookie 只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
- 一个 WEB 站点可以给一个浏览器发送多个 Cookie,一个浏览器也可以存储多个 WEB 站点提供的 Cookie。
- cookie 的总数量没有限制,但是每个域名的 COOKIE 数量和每个 COOKIE 的大小是有限制的 (不同的浏览器限制不同, 知道即可) , Cookie 不适合存放数据量大的信息。
- 注意,删除 cookie 时,path 必须一致,否则不会删除
- Java servlet 中 cookie 中文乱码
说明 如果存放中文的 cookie, 默认报错, 可以通过 URL 编码和解码来解决, 不建议存 放中文的 cookie 信息
代码解决
设置
java
复制代码
publicclassEncoderCookieextendsHttpServlet {protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//System.out.println("EncoderCookie 被调用");//1. 创建cookie, 有中文//1) 如果直接存放中文的cookie, 报错 Control character in cookie value or attribute.//2) 解决方法,就是将中文 编程成 URL编码 英文: Encode=编码//3) 编码后,再保存即可Stringcompany= URLEncoder.encode("大家好", "utf-8");Cookiecookie=newCookie("company", company);//2. 保存到浏览器 response.addCookie(cookie);//3. 给浏览器返回信息 response.setContentType("text/html;charset=utf-8");PrintWriterwriter= response.getWriter(); writer.println("<h1>设置中文cookie成功</h1>"); writer.flush(); writer.close(); }protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doPost(request, response); }}
解码
java
复制代码
publicclassReadCookie2extendsHttpServlet {protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { System.out.println("ReadCookie2 被调用..");//读取到中文cookie Cookie[] cookies = request.getCookies();CookiecompanyCookie= CookieUtils.readCookieByName("company",cookies);StringcompanyVal= companyCookie.getValue(); System.out.println("companyVal= " + companyVal);//URL//解码 companyVal = URLDecoder.decode(companyVal, "utf-8"); System.out.println("解码后 companyVal= " + companyVal);//中文//3. 给浏览器返回信息 response.setContentType("text/html;charset=utf-8");PrintWriterwriter= response.getWriter(); writer.println("<h1>读取中文cookie解码成功~</h1>"); writer.flush(); writer.close(); }protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { doPost(request,response); }}
相关推荐
- Java中List 和 Map、Set 的区别(list和set和map)
-
hello,大家好,我是霖仔java集合的大家了解,我再给大家说一下他们的区别,希望能够帮助到大家结构特点:List和Set是存储单列数据的集合,Map是存储键和值这样的双列数据的集合;Lis...
- Java 集合框架全面解析:选对数据结构,提升开发效率
-
上一章我们详细介绍了各种常用的数据结构情况(参考:数据结构复杂度全览:如何选择最优结构?),本文结合关键数据结构,从列表(List)、队列(Queue)、集合(Set)、映射(Map)四个维度,深入解...
- LinkedList竟然比ArrayList慢了1000多倍?(动图+性能评测)
-
数组和链表是程序中常用的两种数据结构,也是面试中常考的面试题之一。然而对于很多人来说,只是模糊的记得二者的区别,可能还记得不一定对,并且每次到了面试的时候,都得把这些的概念拿出来背一遍才行,未免有些麻...
- LinkedList 底层源码深度解析(linkedlist底层数据结构)
-
目录1.引言2.LinkedList概述2.1类继承体系图2.2各个接口作用3.与ArrayList的对比4.底层数据结构5.核心方法源码解析5.1add()方法5.2a...
- List的用法和实例详解——Java进阶知识讲义系列(四)
-
序欢迎来到全网最完整的Java进阶知识系列教程!!!每天定时更新!!!本期是Java进阶知识系列的第四讲,将分享Java常用的数据容器——集合类。集合类也分很多类型,比如:List、Set、Map、Q...
- Rust高效集合操作(rust基本操作)
-
集合的分类Rust的集合类型主要分布在标准库的std::collections模块中,同时也包括语言内置的数组和字符串类型序列容器序列容器维护元素的顺序,适合需要按索引访问或顺序遍历的场景向量(...
- Java八股文:核心知识点梳理(java八股文是啥)
-
一、Java基础1.Java基本数据类型8种基本类型:整型:byte(1),short(2),int(4),long(8)浮点型:float(4),double(8)字符型:char(2)布...
- 为什么我不推荐研发人员使用 LinkedList?
-
在Java集合框架中,LinkedList作为List的实现之一,经常被认为是ArrayList的替代方案。然而,在大多数实际场景下,我们并不推荐使用LinkedList,原因主要集中...
- ArrayList 、 LinkedList、Vector的区别
-
ArrayList、LinkedList、Vector的区别如下:ArrayListLinkedListVector结构动态数组双向链表动态数组是否线程安全否否是效率遍历查找快,插入删除慢插入删除...
- (2020 )Java最新面试笔试题答案解析(一)
-
Java中的集中基本数据类型是什么?各占用多少字节?【数值型】—(整数类型)byte(1字节)short(2字节)int(4字节)long(8字节)拓展:Java中的数据类型除了上面的基本...
- 超简单五步实现Linux虚拟机CentOS 7系统Root密码忘记重置
-
环境:CentOS7.5重置root密码:1.CentOS7虚拟机开机,将鼠标光标移动至虚拟机内。2.在虚拟机中使用键盘上↑和↓键将选择行设置为第一行(背景高亮即为选中),按下键盘上的e,进...
- 吊轨门和推拉门哪个好?北京今朝区别介绍看完不入坑
-
厨房到底使用什么门好?相信这是大多数业主都比较抓狂的事情,其实在装修中材料的选择最终还是要依据空间而定,那么吊轨门和推拉门哪个好呢?下面就跟随北京装修网一起来看看吧!吊轨门与推拉门介绍吊轨门吊轨门的特...
- 〖省钱宝典〗不花冤枉钱,少走弯路!居家中推拉门如何设计?
-
想要空间最大程度的显大?想要充足的光线?又想拥有合理的区域划分?那么推拉门是你绝对不能错过的好选择。推拉门的设计轻盈简洁,绝对是室内每个空间的福音。它不仅可以最大化地节省空间,方便了居室的功能划分和利...
- 吊趟门与推拉门有什么区别?(吊趟门贵还是推拉门贵)
-
吊趟门与推拉门的区别很多人在购买的时候并不清楚,有些客人甚至根本分不清吊趟门和推拉门,今天小编就给大家讲讲吊趟门与推拉门的相关内容,看看吊趟门与推拉门的区别有哪些?1、推拉门采用以门扇下滑轮为主支撑点...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Java中List 和 Map、Set 的区别(list和set和map)
- Java 集合框架全面解析:选对数据结构,提升开发效率
- LinkedList竟然比ArrayList慢了1000多倍?(动图+性能评测)
- LinkedList 底层源码深度解析(linkedlist底层数据结构)
- List的用法和实例详解——Java进阶知识讲义系列(四)
- Rust高效集合操作(rust基本操作)
- Java八股文:核心知识点梳理(java八股文是啥)
- 面试题:ArrayList和LinkedList有什么区别?
- 为什么我不推荐研发人员使用 LinkedList?
- ArrayList 、 LinkedList、Vector的区别
- 标签列表
-
- hive行转列函数 (63)
- sourcemap文件是什么 (54)
- display none 隐藏后怎么显示 (56)
- 共享锁和排他锁的区别 (51)
- httpservletrequest 获取参数 (64)
- jstl包 (64)
- qsharedmemory (50)
- watch computed (53)
- java中switch (68)
- date.now (55)
- git-bash (56)
- 盒子垂直居中 (68)
- npm是什么命令 (62)
- python中+=代表什么 (70)
- fsimage (51)
- nginx break (61)
- mysql分区表的优缺点 (53)
- centos7切换到图形界面 (55)
- 前端深拷贝 (62)
- kmp模式匹配算法 (57)
- jsjson字符串转json对象 (53)
- jdbc connection (61)
- javascript字符串转换为数字 (54)
- mybatis 使用 (73)
- 安装mysql数据库 (55)