【JavaWeb】Cookie、Session

文章目录

  • Cookie、Session
  • 一、Cookie(客户端)
    • 1、Cookie 的 特点
    • 2、Cookie 的 工作原理
    • 3、Cookie 的 基本操作
    • 5、Cookie 的 域名与路径
    • 6、Cookie 的 存活时间
    • 7、Cookie 的 删除
  • 二、Session(服务端)
    • 1、Session 的 特点
    • 2、Session 的 工作原理
    • 3、Session 的 基本操作
    • 4、Session 的 存活时间
    • 5、Session 的 失效(Cookie导致)

Cookie、Session

一、Cookie(客户端)

Cookie 产生于服务端(服务器),保存在客户端(浏览器)。

  • 将数据保存到客户端(浏览器),降低服务器压力。

1、Cookie 的 特点

  • Cookie 的 数据类型:字符串的键值对 entry (name : value)
  • Cookie 的 大小限制:4k(单个)
  • Cookie 的 数量限制:同一域名下,不能超过50个
  • Cookie 的 唯一性:同一域名下,Cookie 是唯一的(由 path 和 name 决定)
  • Cookie 的 安全性:不安全(信息保存在用户的电脑上,相对来说都不安全)

2、Cookie 的 工作原理

服务器响应时,发送Cookie给浏览器(通过响应头Set-Cookie

在这里插入图片描述

浏览器访问时,携带Cookie到服务器(通过请求头Cookie

在这里插入图片描述

3、Cookie 的 基本操作

创建 Cookie,添加到 HttpServletResponse 对象中返回

// 创建cookie对象
Cookie cookie = new Cookie("product","xiaomi");// 设置cookie作用的域名
cookie.setDomain("localhost");// 设置cookie作用的路径(/代表一切路径)
cookie.setPath("/");// 设置cookie的存活时间(单位是s,默认是-1,浏览器关闭即销毁)
cookie.setMaxAge(24 * 60 * 60);// 添加Cookie到响应中(可以添加多个Cookie)
response.addCookie(cookie);

通过 HttpServletRequest 对象获取 Cookie

// 获取cookie对象
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {String name = cookie.getName();String value = cookie.getValue();
}

5、Cookie 的 域名与路径

// 设置cookie作用的域名
cookie.setDomain("localhost");// 设置cookie作用的路径(/代表一切路径)
cookie.setPath("/");
  • 域名 domain:浏览器请求时,只会携带 域名 和 访问网站一致 的 cookie
  • 路径 path:同一域名下,Cookie 是唯一的(由 path 和 name 决定)

下面举例说明:

Cookie	A 	domain=localhost	path=/a
Cookie	B	domain=localhost	path=/a/b访问  http://localhost:8080/a			携带 A
访问  http://localhost:8080/a/b		携带 A、B
访问  http://localhost:8080/b			不会携带
访问  http://www.baidu.com:8080/a		不会携带

6、Cookie 的 存活时间

// 设置cookie的存活时间(单位是s)
cookie.setMaxAge(24 * 60 * 60);
  • 设置为负数:浏览器将Cookie保存在内存中,浏览器关闭,Cookie销毁。(没有设置 默认是-1
  • 设置为正数:浏览器将Cookie持久化到硬盘中,从浏览器接收到的时间开始算起,MaxAge 秒后到期。
  • 设置为 0:立即销毁。一般用于删除Cookie。

如果希望Cookie可以在多个会话中共享数据(浏览器多次打开关闭),需要设置MaxAge正数

7、Cookie 的 删除

  • 浏览器端:在浏览器中手动清除Cookie
  • 服务器端:发送一个存活时间为0的Cookie覆盖原来的Cookie即可(domain、path、name与要删除的cookie一致)
// 创建cookie对象(domain、path、name与要删除的cookie一致)
Cookie cookie = new Cookie("product","xiaomi");
cookie.setDomain("localhost");
cookie.setPath("/");// 设置存活时间为0(立即销毁)
cookie.setMaxAge(0);// 添加Cookie到响应中
response.addCookie(cookie);

二、Session(服务端)

Session 产生于服务端,保存在服务端。(将 JSESSIONID 通过 cookie 返回给客户端)

  • 将数据保存到服务端(服务器),保证数据的安全性。

1、Session 的 特点

  • Session 的 数据类型:任意类型的数据 Object
  • Session 的 大小和数量:没有限制(取决于服务器的内存)
  • Session 的 安全性:存储的数据相对安全。

2、Session 的 工作原理

Session 是基于 Cookie 实现的。每个 Session 都有一个唯一的编号 JESSIONID

服务器响应时,将 JESSIONID 通过 Cookie 发送给浏览器(通过响应头Set-Cookie

在这里插入图片描述

浏览器访问时,通过 Cookie 携带 JESSIONID(通过请求头Cookie

在这里插入图片描述

通过唯一的编号 JESSIONID,就能获取到对应的 Session

3、Session 的 基本操作

通过 HttpSession 对象进行 Session 的存取

// session不存在,新建session对象 | session已存在,返回已经存在的session
HttpSession session = request.getSession();// 存储 session
session.setAttribute("userName", "zs");// 获取 session 属性
Object userName = session.getAttribute("userName");// 获取 session 的id
String sessionId = session.getId();// 移除 session 属性
session.removeAttribute("userName");// 销毁 HttpSession 对象
session.invalidate();

4、Session 的 存活时间

Session 的 存活时间 由HttpSession的最大不活动时间决定(默认是30min)

代码中设置:

session.setMaxInactiveInterval(15 * 60); // 15分钟

配置文件中设置:

server.servlet.session.timeout=15m  // 15分钟

5、Session 的 失效(Cookie导致)

由于 Session 是基于 Cookie 实现的,如果记录了 JSESSIONID 的 Cookie 被销毁,Session 也会失效。

  • 默认情况下,记录了 JSESSIONID 的 Cookie 由 Tomcat 自动创建,没有设置存活时间,浏览器关闭即销毁。

解决方案:手动创建 name=JESSIONID 的 Cookie,替代 Tomcat 自动创建的 Cookie,并设置存活时间

HttpSession session = request.getSession();
session.setAttribute("userName", "zs");
String id = session.getId();
Cookie cookie = new Cookie("JSESSIONID", id);
cookie.setMaxAge(15 * 60);	// 15分钟
response.addCookie(cookie);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/878445.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python进阶————面向对象高级

面向对象高级 前言一、继承1.1. 单继承1.2. 多继承1.3. 方法重写1.4. 子类调用父类方法1.4.1 父类名.父类方法名()1.4.2 super().父类方法名() 1.5. 多层继承 二、封装2.1. 私有属性2.2. 私有方法 三、多态3.1. 多态的条件3.2. 多态的定义 四、面向对象的其他特性4.1. 对象属性…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(四)- 3GPP Release18内容

一、引言: 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划,是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析(一&#xff…

Codeforces Round 964 (Div. 4) A-E Java题解

比赛地址 Dashboard - Codeforces Round 964 (Div. 4) - Codeforces A题 签到题 给一个两位数 求各位上的数字和 直接对10取余加上本来的数除以10 // 注意类名必须为 Main, 不要有任何 package xxx 信息 // package Dduo; import java.io.*; import java.math.*; import j…

FFmpeg源码:av_rescale_rnd、av_rescale_q_rnd、av_rescale_q、av_add_stable函数分析

一、av_rescale_rnd函数 (一)av_rescale_rnd函数的声明 av_rescale_rnd函数声明在FFmpeg源码(本文演示用的FFmpeg源码版本为7.0.1)的头文件libavutil/mathematics.h中: /*** Rounding methods.*/ enum AVRounding {…

【Android自定义控件】Kotlin实现滚动效果的数字加减控件

前言 因业务上的需要,在APP中点餐时要有商品数目增减操作,数目增减的过程中有翻动的动画效果展现。在Android中有多种方式可以实现,本篇文章记录通过自定义View结合控件的平移动画相结合来实现此需求。 需求分析 根据上图分析控件的实现过程以…

力扣763-划分字母区间(Java详细题解)

题目链接:763. 划分字母区间 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。 贪心方法:局部最优推出全局最优。 如果一个题你觉得可以用局部最优推出全局最优&#xf…

如何在 Vim 中显示行号

前言 Vim 是一款功能强大的文本编辑器,在 Linux、Mac 和 Windows 上都有广泛的应用。对于开发人员来说,能够快速查看代码行号是一个非常实用的功能,尤其是在进行调试或阅读长文件时。本文将介绍如何在 Vim 中开启和关闭行号显示。 开启行号…

【STM32】RS485

RS485是常见的串口接口。 大部分图片来源:正点原子HAL库课程 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目录 1 串口、UART、TTL、RS232、RS422、RS485的关系 1.1 串口 1.2 UART、TTL、RS232、RS422、RS485 1.3 常见串口标准的比较 …

JS 如何判断是否是IE浏览器

例子 if(!!window.ActiveXObject || "ActiveXObject" in window){alert("抱歉,不支持IE浏览器!");return; }

亚马逊云技术深度解析与实战案例

亚马逊云技术深度解析与实战案例 引言 亚马逊云(Amazon Web Services, AWS)作为全球云计算技术的领导者,以其丰富的服务种类、强大的基础设施和持续的技术创新,为企业和个人开发者提供了前所未有的灵活性和扩展性。本文将深入探讨亚马逊云的核心技术,并通过一个具体的代…

vue el-tree主键id重复 添加自增id 以及原相同节点同步勾选 同步操作

树数据只提供了nodeId,且存在不同节点重复nodeId的问题,由于树组件的node-key需要唯一性,所有这个时候我们需要给数据添加自增id (延申问题:操作某个节点的时候,同步操作与他nodeId相同的节点)&…

【微机原理】v和∧区别

🌟 嗨,我是命运之光! 🌍 2024,每日百字,记录时光,感谢有你一路同行。 🚀 携手启航,探索未知,激发潜能,每一步都意义非凡。 在汇编语言和逻辑表达…

UE 【材质编辑】自定义材质节点

使用UE的材质编辑器,蓝图提供了大量的节点函数: 实际上,这是一段封装好的包含一串HLSL代码的容器。打开“Source/Runtime/Engine/Classes/Material”,可以看到很多不同节点的头文件: 照葫芦画瓢 以UMaterialExpressi…

★ 算法OJ题 ★ 力扣 LCR179 - 和为 s 的两个数字

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;小诗歌剧将和大家一起做一道双指针算法题--和为 s 的两个数字~ 目录 一 题目 二 算法解析 三 编写算法 一 题目 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 二 算法解析 …

MacOS使用FileZilla通过ssh密钥文件连接远程服务器(已解决)

需求描述 mac电脑,使用filezilla通过FTP连接远程服务器,使用ssh密钥文件代替密码。 版本信息 MacOS:Sonoma 14.5 M3芯片 FileZilla:3.66.5 在这里插入图片描述 连接 1. 创建站点 打开filezilla工具,右上角选择“文件 -> 站点管理器”,打开站点管理器弹窗。 2.…

2024“钉耙编程”中国大学生算法设计超级联赛(9)

传送门 1005 怪物猎人 如果全用 x 和 全用 y 攻击的轮次不同那么奇偶轮次都可以击败怪物&#xff1b;否则只有奇数轮次或者偶数轮次能够击败怪物。 #include <bits/stdc.h> using namespace std;#define int long longinline int read() {int x 0, f 1; char c get…

AI搜索:重塑信息获取的新纪元

在信息爆炸的时代&#xff0c;如何快速、准确地获取所需信息成为了每个人面临的挑战。传统的搜索引擎虽然在一定程度上解决了这一问题&#xff0c;但广告干扰、结果冗余、内容质量参差不齐等问题仍让用户体验大打折扣。随着AI技术的不断发展&#xff0c;AI搜索产品以其独特的优…

将工程内的组件 集成并发布到私有仓库以及后续联动运行(热启动)

将工程内的组件 发布到私有仓库 背景与简介 1、项目的数据 私有仓库地址&#xff1a; 【】 私有仓库账号/密码&#xff1a; 【】 组件包名称&#xff1a; 【ciec/ciec-component-pc】 组件包项目git地址&#xff1a;【 】 node版本&#xff1a;【】 2、文献链接 a)t b) 3、注意…

docker安装配置、docker命令

一、CentOS7安装docker 1、安装 Docker CE 支持 64 位版本 CentOS 7&#xff0c;并且要求内核版本不低于 3.10&#xff0c; CentOS 7 满足最低内核的要求&#xff0c;所以我们在CentOS 7安装Docker。 卸载旧docker 如果之前安装过旧版本的Docker&#xff0c;可以使用下面命令…

DFS、BFS、Union-Find:找出图中省份数量的最佳方法

题目理解 问题描述&#xff1a; 有 n 个城市&#xff0c;其中一些城市之间直接相连&#xff0c;另一些则不相连。如果城市 a 和城市 b 直接相连&#xff0c;且城市 b 和城市 c 直接相连&#xff0c;那么城市 a 和城市 c 间接相连。省份被定义为一组直接或间接相连的城市&…