当前位置: 首页 > news >正文

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返回到浏览器这边了。

相关文章:

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

一.Cookie和Session Cookie和Session都是用于在Web应用中跟踪用户状态的技术。Cookie是存储在用户浏览器中的小文本文件&#xff0c;由服务器发送给浏览器。当用户再次访问同一网站时&#xff0c;浏览器会把Cookie信息发送回服务器。例如&#xff0c;网站可以利用Cookie记住用…...

最新物流行业CRM系统应用数字化解决方案

因势利导 ——全球化物流的挑战与机遇 在全球经济一体化与互联网技术快速发展的双重驱动下,物流行业正经历着前所未有的变革时期。这一变革不仅影响 着行业的发展模式,还对运营效率和客户体验提出了新的要求。 随着市场需求的不断演变,物流行业已呈现出多元化和专业 化并行的发…...

[deadlock]死锁导致的设备登录无响应问题

[deadlock]死锁导致的设备登录无响应问题 一、问题现象二、初步观察三、继续深挖查看netlink相关信息查看warnd进程栈 四、再接再厉查看warnd 用户栈 后记 一、问题现象 实验室一台压力测试设备突然无法登录&#xff0c;无论web页面&#xff0c;ssh或者telnet登录&#xff0c;…...

2024年10月21日计算机网络,乌蒙第一部分

【互联网数据传输原理 &#xff5c;OSI七层网络参考模型】 https://www.bilibili.com/video/BV1EU4y1v7ju/?share_sourcecopy_web&vd_source476fcb3b552dae37b7e82015a682a972 mac地址相当于是名字&#xff0c;ip地址相当于是住址&#xff0c;端口相当于是发送的东西拿什…...

ESlint代码规范

这里写目录标题 ESlint代码规范解决代码规范错误 ESlint代码规范 代码规范&#xff1a;一套写代码的约定规则。例如&#xff1a;“赋值符号左右是否需要空格” “一行代码结束是否要加分号” JavaScript Standard Style规范说明&#xff1a;https://standardjs.com/rules-zhc…...

【Vue.js设计与实现】第三篇第11章:渲染器-快速 Diff 算法-阅读笔记

文章目录 11.1 相同的前置元素和后置元素11.2 判断是否需要进行 DOM 移动操作11.3 如何移动元素11.4 总结 系列目录&#xff1a;【Vue.js设计与实现】阅读笔记目录 非常快的Diff算法。 11.1 相同的前置元素和后置元素 不同于简单 Diff 算法和双端 Diff 算法&#xff0c…...

材质变体 PSO学习笔记

学习笔记 参考各路知乎大佬文章 首先是对变体的基本认知 概括就是变体是指根据引擎中上层编写(UnityShaderLab/UE连连看)中的各种defines情况&#xff0c;根据不同平台编译成的底层shader&#xff0c;OpenGL-glsl/DX(9-11)-dxbc DX12-dxil/Vulkan-spirv&#xff0c;是打到游…...

2024年【烟花爆竹储存】考试及烟花爆竹储存复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 烟花爆竹储存考试参考答案及烟花爆竹储存考试试题解析是安全生产模拟考试一点通题库老师及烟花爆竹储存操作证已考过的学员汇总&#xff0c;相对有效帮助烟花爆竹储存复审模拟考试学员顺利通过考试。 1、【单选题】( …...

文件夹操作

文件夹操作 opendir closedir readdir write(fd,buf,strlen(buf)); return 0; } 作用 : 打开目录 opendir 所有头文件 : #include <sys/types.h> #include <dirent.h> 函数 : DIR *opendir(const char *name); 参数&#xff1a; name &#xff1a;目…...

如何制作一台自己想要的无人机?无人机改装调试技术详解

制作一台符合个人需求的无人机并对其进行改装调试&#xff0c;是一个既具挑战性又充满乐趣的过程。以下是从设计、选购材料、组装、调试到改装的详细步骤&#xff1a; 一、明确需求与设计 1. 明确用途与性能要求&#xff1a; 确定无人机的使用目的&#xff0c;如航拍、比赛、…...

Linux -- 进程间通信、初识匿名管道

目录 进程间通信 什么是进程间通信 进程间通信的一般规律 前言&#xff1a; 管道 代码预准备&#xff1a; 如何创建管道 -- pipe 函数 参数&#xff1a; 返回值&#xff1a; wait 函数 参数&#xff1a; 验证管道的运行&#xff1a; 源文件 test.c &#xff1a; m…...

网站的SSL证书快到期了怎么办?怎么续签?

网站的SSL证书即将到期时&#xff0c;需要续签一个新的证书以保持网站的安全性和信任度。以下是续签SSL证书的一般步骤&#xff1a; 1. 选择证书提供商 如果您之前使用的是免费证书&#xff0c;您可以选择继续使用同一提供商的免费证书服务进行续签。如果您需要更高级别的证书…...

解決爬蟲代理連接的方法

爬蟲在運行過程中常常會遇到代理連接的問題&#xff0c;這可能導致數據抓取的效率降低甚至失敗。 常見的代理連接問題 代理IP失效&#xff1a;這是最常見的問題之一。有些代理IP可能在使用一段時間後失效&#xff0c;導致連接失敗。 連接超時&#xff1a;由於網路不穩定或代…...

Prometheus 监控Harbor

你好&#xff01;今天分享的是基于Prometheus监控harbor服务。 在之前的文章中分别介绍了harbor基于离线安装的高可用汲取设计和部署。那么&#xff0c;如果我们的harbor服务主机或者harbor服务及组件出现异常&#xff0c;我们该如何快速处理呢&#xff1f; Harbor v2.2及以上…...

SQL 干货 | SQL 半连接

大多数数据库开发人员和管理员都熟悉标准的内、外、左和右连接类型。虽然可以使用 ANSI SQL 编写这些连接类型&#xff0c;但还有一些连接类型是基于关系代数运算符的&#xff0c;在 SQL 中没有语法表示。今天我们将学习一种这样的连接类型&#xff1a;半连接&#xff08;Semi …...

洛谷 P1226:【模板】快速幂

【题目来源】https://www.luogu.com.cn/problem/P1226【题目描述】 给你三个整数 a&#xff0c;b&#xff0c;p&#xff0c;求 a^b mod p。【输入格式】 输入只有一行三个整数&#xff0c;分别代表 a&#xff0c;b&#xff0c;p。【输出格式】 输出一行一个字符串 a^b mod ps&a…...

nginx常规操作

Linux下查找Nginx配置文件位置 1、查看Nginx进程 ps -aux | grep nginx 圈出的就是Nginx的二进制文件 2、测试Nginx配置文件 /usr/sbin/nginx -t 可以看到nginx配置文件位置 3、nginx的使用(启动、重启、关闭) 首先利用配置文件启动nginx。 nginx -c /usr/local/nginx/conf…...

Docker镜像不能访问

Get "https://registry-1.docker.io/v2/": dial tcp 192.168.10.194:443: connect: connection refused Idea推送镜像至Harbor私服&#xff0c;报以上错误&#xff0c;Docker镜像地址不能访问&#xff0c;更新Harbor服务器Docker镜像地址&#xff0c;重启Docker服务…...

TCP simultaneous open测试

源代码 /*************************************************************************> File Name: common.h> Author: hsz> Brief:> Created Time: 2024年10月23日 星期三 09时47分51秒**********************************************************************…...

Spring 配置文件动态读取pom.xml中的属性

需求&#xff1a; 配置文件中的 spring.profiles.active${env}需要打包时动态绑定。 一、方案&#xff1a; 在pom.xml文件中配置启用占位符替换 <profiles><!-- 本地开发 --><profile><id>dev</id><properties><env>dev</env>…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...