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.mzph.cn/news/883202.shtml

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

相关文章

java 17天 TreeSet以及Collections

SortedSet TreeSet Collections 所有单值集合 1 SortedSet 特点&#xff1a;有序 唯一 实现类&#xff1a;TreeSet 利用TreeSet特有的对数据进行升序&#xff0c;再放到ArryList进行for下标倒序打印&#xff0c;或者利用自身的pollLast&#xff08;&#xff09;取出最后元…

金融工程--pine-script 入门

背景 脚本基本组成 策略实现 实现马丁格尔策略 初始化变量&#xff1a;定义初始资本、初始头寸大小、止损百分比、止盈百分比以及当前资本和当前头寸大小等变量。 更新头寸&#xff1a;创建一个函数来更新头寸大小、止损价格和止盈价格。在马丁格尔策略中&#xff0c;每次亏…

如何在算家云搭建GPT-SOVITS(语音转换)

一、模型介绍 GPT-SOVITS是一款强大的小样本语音转换和文本转语音 WebUI工具。它集成了声音伴奏分离、自动训练集分割、中文ASR和文本标注等辅助工具。 具有以下特征&#xff1a; 零样本 TTS&#xff1a; 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&…

micro-app【微前端实战】主应用 vue3 + vite 子应用 vue3+vite

micro-app 官方文档为 https://micro-zoe.github.io/micro-app/docs.html#/zh-cn/framework/vite 子应用 无需任何修改&#xff0c;直接启动子应用即可。 主应用 1. 安装微前端框架 microApp npm i micro-zoe/micro-app --save2. 导入并启用微前端框架 microApp src/main.ts …

智联招聘×Milvus:向量召回技术提升招聘匹配效率

01. 业务背景 在智联招聘平台&#xff0c;求职者和招聘者之间的高效匹配至关重要。招聘者可以发布职位寻找合适的人才&#xff0c;求职者则通过上传简历寻找合适的工作。在这种复杂的场景中&#xff0c;我们的核心目标是为双方提供精准的匹配结果。在搜索推荐场景下&#xff0c…

leetcode-75-颜色分类

题解&#xff08;方案二&#xff09;&#xff1a; 1、初始化变量n0&#xff0c;代表数组nums中0的个数&#xff1b; 2、初始化变量n1&#xff0c;代表数组nums中0和1的个数&#xff1b; 3、遍历数组nums&#xff0c;首先将每个元素赋值为2&#xff0c;然后对该元素进行判断统…

druid 连接池监控报错 Sorry, you are not permitted to view this page.本地可以,发布正式出错

简介&#xff1a; druid 连接池监控报错 Sorry, you are not permitted to view this page. 使用Druid连接池的时候&#xff0c;遇到一个奇怪的问题&#xff0c;在本地&#xff08;localhost&#xff09;可以直接打开Druid连接池监控&#xff0c;在其他机器上打开会报错&#…

计数问题[NOIP2013]

题目描述 试计算在区间 1 到 n 的所有整数中&#xff0c;数字 x&#xff08;0≤x≤9&#xff09;共出现了多少次&#xff1f;例如&#xff0c;在 1 到 11 中&#xff0c;即在 1,2,3,4,5,6,7,8,9,10,11 中&#xff0c;数字 1 出现了 4 次。 输入格式 2 个整数 n,x&#xff0c;之…

【开源项目】经典开源项目数字孪生工地——开源工程及源码

飞渡科技数字孪生工地管理平台&#xff0c;以物联网、移动互联网技术为基础&#xff0c;充分应用人工智能等信息技术&#xff0c;通过AI赋能建筑行业&#xff0c;对住建项目内人员、车辆、安全、设备、材料等进行智能化管理&#xff0c;实现工地现场生产作业协调、智能处理和科…

sortablejs(前端拖拽排序的实现)

源文档&#xff1a;sortablejs - npm 安装 npm install sortablejs --save 引入项目 import Sortable from sortablejs; 使用示例 <template><ul id"items"><li>item 1</li><li>item 2</li><li>item 3</li>&l…

【JavaEE】【多线程】单例模式

目录 一、设计模式1.1 单例模式1.1.1 饿汉模式1.1.2 懒汉模式 1.2 线程安全问题1.3 懒汉模式线程安全问题的解决方法1.3.1 原子性问题解决1.3.2 解决效率问题1.3.3 解决内存可见性问题和指令重排序问题 一、设计模式 在讲解案例前&#xff0c;先介绍一个概念设计模式&#xff…

stm32入门教程--ADC模拟-数字转换器

ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC可以将引脚上连续变化的模拟电压转你换位内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁。 12位逐次逼近型ADC&#xff0c;1us转换时间 输入电压范围&#xff1a;0-3.3V转换结果范围…

Pyramidal Flow使用指南:快手、北大、北邮,开源可免费商用视频生成模型,快速上手教程

什么是 Pyramidal Flow&#xff1f; Pyramidal Flow 是由快手科技、北京大学和北京邮电大学联合推出的开源视频生成模型&#xff0c;它是完全开源的&#xff0c;发布在 MIT 许可证下&#xff0c;允许商业使用、修改和再分发。该模型能够通过文本描述生成最高10秒、分辨率为128…

Docker搭建开源Web云桌面操作系统Puter和DaedalOS

文章目录 Puter 操作系统说明基于 Docker 启动 Puter 操作系统拉取镜像运行容器基于 Docker-Compose 启动 Puter操作系统创建目录编写docker-compose.yml运行在本地直接运行puter操作系统puter界面截图puter个人使用总结构建自己的Puter镜像daedalos基于web的操作系统说明技术特…

Embedding 模型和Model 批量推理和多卡部署

批量推理 多卡部署 使用huggingface 【AI大模型】Transformers大模型库&#xff08;七&#xff09;&#xff1a;单机多卡推理之device_map_transformers多卡推理-CSDN博客 首先用 CUDA_VISIBLE_DEVICES1,2,3 python 或者os.environ["CUDA_VISIBLE_DEVICES"] &q…

风力发电场的“守护神”

摘要&#xff1a;作为清洁能源之一&#xff0c;风力发电场近几年装机容量快速增长。8月17日&#xff0c;国家能源局发布1-7月份全国电力工业统计数据。截至7月底&#xff0c;全国累计发电装机容量约27.4亿千瓦&#xff0c;同比增长11.5%。其中&#xff0c;太阳能发电装机容量约…

【Flutter】基础入门:Widgets

在 Flutter 中&#xff0c;Widget 是应用程序构建块的基础。几乎所有的对象都是一个 Widget&#xff0c;不论是显示在屏幕上的 UI 元素&#xff0c;还是一些功能性组件&#xff08;例如用于手势检测的 GestureDetector&#xff0c;或用于传递应用主题数据的 Theme&#xff09;&…

TCP simultaneous open测试

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

转录组上游分析流程(三)

环境部署——数据下载——查看数据(非质控)——数据质控——数据过滤(过滤低质量数据) 测序得到的原始序列含有接头序列和低质量序列&#xff0c;为了保证信息分析的准确性&#xff0c;需要对原始数据进行质量控制&#xff0c;得到高质量序列(Clean Reads)&#xff0c;原始序列…

Linux系统块存储子系统分析记录

1 Linux存储栈 通过网址Linux Storage Stack Diagram - Thomas-Krenn-Wiki-en&#xff0c;可以获取多个linux内核版本下的存储栈概略图&#xff0c;下面是kernel-4.0的存储栈概略图&#xff1a; 2 存储接口、传输速度 和 协议 2.1 硬盘 《深入浅出SSD&#xff1a;固态存储核心…