Servlet(三)-------Cookie和session

在这里插入图片描述

一.Cookie和Session

Cookie和Session都是用于在Web应用中跟踪用户状态的技术。Cookie是存储在用户浏览器中的小文本文件,由服务器发送给浏览器。当用户再次访问同一网站时,浏览器会把Cookie信息发送回服务器。例如,网站可以利用Cookie记住用户的登录状态、语言偏好等信息。Cookie有一定的有效期,可以设置过期时间。Session是存储在服务器端的数据结构,用于跟踪用户的会话状态。服务器为每个用户(通常是通过用户的首次请求)创建一个Session,会给用户分配一个唯一的标识符(Session ID),这个ID一般通过Cookie或URL参数等方式传递给浏览器。当用户在网站的不同页面之间跳转时,浏览器会发送Session ID,服务器根据这个ID来识别用户并获取对应的会话数据,如购物车中的商品信息等。

二.Cookie和Session的联系与区别

1.cookie是什么

在浏览器访问服务器之前,此时你的浏览器对于这个服务器是一无所知的,你的浏览器上是没有任何和这个服务器相关的数据的。在网页开发中用户获取数据和服务器发送数据会产生很多“临时性”的数据。临时性的数据有的可以放在服务器这边存储,有的可以放在浏览器上,用户下次用可以直接获取到。
比如哔哩哔哩中倍速播放,蓝光模式这种数据就是临时数据,用户下次再点开还是倍速蓝光。
在这里插入图片描述

浏览器要保存数据为什么要放在cookie上,直接放硬盘上不行吗?
答案:不行,如果让网页能轻易的访问你的系统文件是非常危险的有可能会中病毒让电脑奔溃或者数据删掉。为了保证安全浏览器会对网页的功能做出限制,禁止访问硬盘。为了能保证安全又能存储数据,浏览器就提供了cookie功能。

cookie是按照键值对的方式存储一些字符串。这些键值对往往是服务器返回来的。浏览器把这些键值对按照域名进行分类存储,不同的网站cookie是独立的。这些cookie的内容是程序员自己定义的。

在这里插入图片描述

一个网站中cookie中会存储很多键值对,往往会有一个很重要的键值对,用来统计用户的信息。为了实现身份识别的效果,不仅仅需要cookie来支持,在服务器这边也需要session来支持。

2.举例

假设你是第一次来医院看病,首次挂号的时候,医院会让你办一张就诊卡。同时在医院的系统里面会给你创建一份电子的档案。当你排了半天队,见到医生,医生让你刷你的就诊卡,你一刷卡你的各种信息就显示在医生的电脑上了。(就诊卡里面存了你的身份标识,存了一串字符串,就像电话号码一样),电子档案可以想象成哈希表,key是你的身份标识,value是你的电子档案详情。刷卡的时候读卡器读到我的身份标识就可以知道我的电子档案的详情了。然后医生让你去抽血,做B超,尿检。到了抽血科,医生也是让先刷卡,刷卡后知道你的病就知道要抽多少血哪里的血。来到B超科后同样先刷卡拿到你的信息,就知道怎么检查。检查完毕后医生还得刷卡拿信息取药。当你下一次来的时候医生可以直接系统里面拿到你的信息和之前的取药结果。

首次访问网站登录成功后相当于网站给你一个就诊卡(身份标识,身份标识也叫sessionid),身份标识就通过服务器返回给浏览器的响应,保存在浏览器的cookie中了。与此同时人家网站服务器这边也会创建出一个对应的session(电子档案),session中会记录你的信息。网站服务器有很多个用户,每个用户都有自己的session,他们的sessionid各不相同,服务器会使用类似于HASH表这样的方式,以sessionid为key,以session为value,把所有数据组织起来。后续访问网站的其他页面(相当于到各个科室做检查),都会在请求的cookie字段中,带上刚才这里的sessionid(也就是做检查先刷卡,判断你的信息),服务器就知道你当前的用户信息了。

我们通过抓包可以看到cookie里面的主要内容:
在这里插入图片描述
是以键值对的方式去存储的。键值对之间使用;分割,键和值使用=分割。在cookie中其中一个键值对是表示身份标识的。

3.Session

session存在的意义也是为了让用户能够保存一些自定义数据,此时的session更像是一个Map<String,Object>。session在一个服务器上可以存在很多份,每个用户都应该有一个自己的session,应该服务器有多个用户,服务器就会用map的方式组织session.
在这里插入图片描述

4.总结

Cookie 是浏览器在本地持久化存储数据的一种机制。
1.Cookie的数据从哪里来?服务器返回给浏览器的。
2.Cookie的数据长啥样?Cookie 中是键值对结构的数据.并且这里的键值对都是程序员自定义的。
3.Cookie有什么作用?Cookie 就可以在浏览器这边存储一些“临时性的数据”,其中最典型的一种使用方式,就是用来存储“身份标识”。
4.Cookie到哪里去?Cookie的内容会在下次访问该网站的时候,自动的被带到HTTP请求中。
5.Cookie怎么存的?浏览器按照不同的“域名”分别存储Cookie,域名和域名之间的Cookie是不能干扰的Cookie 存储在硬盘上的。Cookie存储往往会有一个超时时间。

Cookie的超时时间也叫过期时间,是指浏览器存储Cookie的有效时长。当服务器发送一个Cookie给浏览器时,会设置这个Cookie的相关属性,其中就包括过期时间。如果没有设置超时时间,Cookie就会成为会话Cookie,它会在浏览器会话期间(即浏览器打开到关闭的时间段)一直存在,一旦浏览器关闭,会话Cookie就会被删除。 要是设置了具体的超时时间,浏览器会根据这个时间来存储Cookie。例如,设置超时时间为1小时,那么从Cookie被设置开始计算,1个小时后,浏览器会自动删除这个Cookie,之后对相应网站的请求就不会再带上这个已经过期的Cookie。这样的机制可以控制用户数据在客户端存储的周期,用于实现如用户登录状态保持一定时间等功能。
在这里插入图片描述

在这里插入图片描述

二.核心方法

HttpServletRequest 类中的相关方法
在这里插入图片描述

HttpServletResponse类中的相关方法
在这里插入图片描述
HttpSession 类中的相关方法
一个 HttpSession 对象里面包含多个键值对. 我们可以往 HttpSession 中存任何我们需要的信息。
在这里插入图片描述
Cookie 类中的相关方法
在这里插入图片描述

HTTP 的 Cooke 字段中存储的实际上是多组键值对. 每个键值对在 Servlet 中都对应了一个 Cookie
对象。
通过 HttpServletRequest.getCookies() 获取到请求中的一系列 Cookie 键值对。
通过 HttpServletResponse.addCookie() 可以向响应中添加新的 Cookie 键值对。

1.获取cookie

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.util.Enumeration;
class User{public String username;public int age;
}
@WebServlet("/hello1")
public class HelloSevert extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie cookie = new Cookie("date","2024-10-24");resp.addCookie(cookie);Cookie cookie1 = new Cookie("date1","2024-10-25");resp.addCookie(cookie1);resp.getWriter().write("ok");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie[] cookies = req.getCookies();for(Cookie x:cookies){System.out.println(x.getName()+":"+x.getValue());}}
}

在这里插入图片描述
通过抓包继续观察
在这里插入图片描述

2.获取session

代码示例: 实现用户登陆
实现简单的用户登陆逻辑
这个代码中主要是通过 HttpSession 类完成. 并不需要我们手动操作 Cookie 对象。

import com.fasterxml.jackson.databind.ObjectMapper;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.Enumeration;
class User{public String username;public int age;
}
@WebServlet("/hello1")
public class HelloSevert extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String user = req.getParameter("username");String password = req.getParameter("password");if(user==null||password==null||user.equals("")||password.equals("")){resp.setContentType("text/html,charset=utf8");resp.getWriter().write("用户名错误");return;}if(user.equals("aaa")&&password.equals("123")){HttpSession session = req.getSession(true);session.setAttribute("username",user);session.setAttribute("time",System.currentTimeMillis());}}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();if(session==null){return;}String user = (String)session.getAttribute("username");System.out.println("user:"+user);}
}

在这里插入图片描述
在这里插入图片描述

HttpSession session = req.getSession(true);参数为true不存在会话就创建,存在会话就直接查询。参数为false不存在就返回null,存在就直接查询。
getSession 背后做的事情:
1.先读取请求中的Cookie,看Cookie 里是否有JSESSIONID属性,以及值是啥。如果没有,就认为需要创建新会话。如果有,就拿着这个id去查询看看当前的session 是否存在,要是 session存在,就直接返回该 session,要是session不存在,就准备创建新会话。
2.当前确实需要创建会话,就会创建出一个Session 对象,同时生成一个唯一的JSESSIONID。
以JSESSIONID为key,Session对象为value,把这个键值对给插入到服务器 上述的哈希表
3.刚才生成的JSESSIONID又会通过addCookie方法,加入到响应中。此时响应里就会带有Set-Cookie字段,这里的值就是JSESSION=xxxxxxxxx通过响应,就把JSESSIONID返回到浏览器这边了。

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

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

相关文章

Python与MySQL

一、Python 操作 MySQL 数据库软件 我们在上一篇文章《SQL入门》中使用了图形化工具DBeaver操作MySQL数据库软件&#xff0c;除了使用图形化工具以外&#xff0c;我们也可以使用编程语言来执行 SQL 从而操作数据库&#xff0c;可以在 Python 中&#xff0c;使用第三方库 pymys…

设计师的新宠:7款不容错过的界面设计软件

在UI设计领域&#xff0c;设计师们常常需要借助各种工具来实现他们的创意。市场上众多的设计软件让设计师们有了丰富的选择&#xff0c;但同时也带来了选择困难。一个好的软件界面设计工具不仅能提升工作效率&#xff0c;还能为设计师提供丰富的资源和参考&#xff0c;帮助他们…

Python:背景知识及环境安装

一、计算机的基础概念 1.1 什么是计算机&#xff1f; 最早我们有计算器&#xff0c;但是他只能完成算数运算的功能 而计算机能完成的工作有&#xff1a; &#xff08;1&#xff09;算术运算 &#xff08;2&#xff09;逻辑判断 &#xff08;3&#xff09;数据存储 &#xff08…

使用AutoDL训练YOLO等计算机视觉网络模型(AutoDL+Xftp+VS Code),附详细操作步骤

前言 本文记录利用AutoDL云服务器&#xff0c;使用VS Code远程连接进行模型训练&#xff0c;步骤完整&#xff0c;操作简便&#xff0c;不需要使用任何命令即可快速运行&#x1f680;。 专栏目录&#xff1a;YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Bac…

分享几个办公类常用的AI工具

办公类 WPS AI讯飞智文iSlideProcessOn亿图脑图ChatPPT WPS AI 金山办公推出的协同办公 AI 应用&#xff0c;具有文本生成、多轮对话、润色改写等多种功能&#xff0c;可以辅助用户进行文档编辑、表格处理、演示文稿制作等办公操作。 https://ai.wps.cn/ 讯飞智文 科大讯飞推…

博弈论 C++

前置知识 若一个游戏满足&#xff1a; 由两名玩家交替行动在游戏进行的任意时刻&#xff0c;可以执行的合法行动与轮到哪位玩家无关不能行动的玩家判负 则称该游戏为一个公平组合游戏。 尼姆游戏&#xff08;NIM&#xff09;属于公平组合游戏&#xff0c;但常见的棋类游戏&…

企业数字化转型建设方案(数据中台、业务中台、AI中台)

方案介绍&#xff1a; 企业数字化转型建设方案中的数据中台是企业数字化转型的核心基础设施&#xff0c;负责数据的整合、治理、共享和应用&#xff0c;将数据转化为资产&#xff0c;服务于业务决策和运营。业务中台是连接数据中台和技术中台的桥梁&#xff0c;负责业务的抽象…

Redis Search系列 - 第六讲 基准测试 - Redis Search VS. MongoDB VS. ElasticSearch

目录 一、引言二、Redis Search 2.x版本的性能提升三、Redis Search VS. MongoDB VS. ElasticSearch3.1 测试环境3.2 100%写 - 基准测试3.3 100%读 - 基准测试3.4 混合读/写/搜索 - 基准测试2.5 搜索延迟分析3.6 读延迟分析3.7 写延迟分析3.8 Redis Search VS. ElasticSearch3.…

DSPy:不需要手写prompt啦,You Only Code Once!

论文地址&#xff1a;https://arxiv.org/abs/2310.03714   项目地址&#xff1a;https://github.com/stanfordnlp/dspy 文章目录 1. 背景2. 签名3. 模块3.1 预测模块3.2 其他内置模块 4. 提词器5. 评估目标6. 代码分析6.1 _prepare_student_and_teacher6.2 _prepare_predicto…

985研一,转嵌入式好还是后端开发好?

有个老铁问&#xff0c;985研一&#xff0c;转嵌入式好还是后端开发好&#xff1f; 我认为&#xff0c;这学历&#xff0c;两个随便挑&#xff0c;我说的&#xff0c;从趋势来看&#xff0c;更建议嵌入式&#xff0c;走供应链上游&#xff0c;芯片原厂、新能源车企、军工或者搞…

力扣143:重排链表

给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为&#xff1a; L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示…

qt creator 转 visual stdio 项目调试

因果 大家在使用qt creator调试程序时&#xff0c;会出现未知错误&#xff0c;比如下图&#xff0c;直接release运行就没有问题。由于调试复杂程序&#xff0c;使用qt creator都感觉不如vs&#xff0c;会报未知中断。 所以有了从qt creator转换到 visual stdio来调试的想法。…

【电子元件】光通量和色温 (欧司朗LED灯珠 KW3 CGLNM1.TG命名规则)

什么是光通量&#xff1f; 光通量&#xff08;Luminous Flux&#xff09;是衡量光源在单位时间内发出的可见光总量的物理量&#xff0c;表示的是光源产生的总光能量&#xff0c;其中只考虑人眼能感知的部分。它通常以流明&#xff08;lumen&#xff0c;符号为 lm&#xff09;为…

如何使用gitlab切换分支

第一步&#xff0c;在gitlab上新建一个远程分支。选择New branch即可新建一个&#xff0c;但是注意往往是在当前分支下新建的分支&#xff0c;所以新分支里会有当前分支的内容。 第二步&#xff0c;在本地当前分支在运行这三行命令&#xff0c;即可得到一个空的新分支。 git c…

springboot2.0x 和springboot 1.0 整合redis 使用自定义CacheManager 问题

问题描述&#xff1a; 在我们深入理解springboot2.0x的缓存机制的时候&#xff0c;发现在springboot1.0 和springboot2.0 中默认的序列化都是使用的jdk的 Serializer 实现这个接口&#xff0c;jdk自带的序列化方法&#xff0c;由此我们需要自己去创建自定义的RedisCacheManager…

《Python游戏编程入门》注-第2章2

《Python游戏编程入门》的“2.2.5 绘制线条”中提到了通过pygame库绘制线条的方法。 1 相关函数介绍 通过pygame.draw模块中的line()函数来绘制线条&#xff0c;该函数的格式如下所示。 line(surface, color, start_pos, end_pos, width1) -> Rect 其中&#xff0c;第一…

AUTOSAR CP 中 BswM 模块功能与使用介绍(2/2)

三、 AUTOSAR BswM 模块详解及 ARXML 示例 BswM 模块的主要功能 BswM&#xff08;Basic Software Mode Manager&#xff09;模块在 AUTOSAR 架构中扮演着模式管理的核心角色。它负责管理车辆的各种模式&#xff08;如启动、运行、停车等&#xff09;&#xff0c;并根据不同的…

基于vue框架的的电子商务网站68pwt(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,商品分类,商品信息 开题报告内容 基于Vue框架的电子商务网站开题报告 一、研究背景与意义 随着互联网技术的不断发展和普及&#xff0c;电子商务已成为现代商业活动的重要组成部分。电子商务网站作为线上交易的主要平台&#xf…

Apple Vision Pro市场表现分析:IDC最新数据揭示的真相

随着AR/VR技术逐渐成熟并被更多消费者接受,2024年第二季度(Q2)成为这一领域的一个重要转折点。根据国际数据公司(IDC)发布的最新报告,整个AR/VR市场在本季度经历了显著的增长。接下来,我们将深入探讨Apple Vision Pro在这股增长浪潮中的具体表现。 市场背景 2024年Q2,…

Excel:vba实现生成随机数

Sub 生成随机数字()Dim randomNumber As IntegerDim minValue As IntegerDim maxValue As Integer 设置随机数的范围(假入班级里面有43个学生&#xff0c;学号是从1→43)minValue 1maxValue 43 生成随机数(在1到43之间生成随机数)randomNumber Application.WorksheetFunctio…