Java EE Servlet之Cookie 和 Session

文章目录

  • 1. Cookie 和 Session
    • 1.1 Cookie
    • 1.2 理解会话机制 (Session)
      • 1.2.1 核心方法
  • 2. 用户登录
    • 2.1 准备工作
    • 2.2 登录页面
    • 2.3 写一个 Servlet 处理上述登录请求
    • 2.4 实现登录后的主页
  • 3. 总结

1. Cookie 和 Session

1.1 Cookie

cookie 是 http 请求 header 中的一个属性

浏览器持久化存储数据的一种机制
网页无法访问主机的文件系统,要想存储数据就得通过其他的凡是

cookie 中保存的数据,也是键值对的格式(用户自定义的)
最终还是要把这个键值对发送回服务器的

服务器要使用 cookie 来完成一些业务逻辑


其中有一个 特殊的情况,就是使用 cookie 存储当前用户的身份信息


举个栗子:

  1. 到了医院先挂号.,挂号时候需要提供身份证,同时得到了一张 “就诊卡”,这个就诊卡就相当于患者的 “令牌”
  2. 后续去各个科室进行检查,诊断,开药等操作,都不必再出示身份证了,只要凭就诊卡即可识别出当前患者的身份
  3. 看完病了之后,不想要就诊卡了,就可以注销这个卡,此时患者的身份和就诊卡的关联就销毁了 (类似于网站的注销操作)
  4. 又来看病,可以办一张新的就诊卡,此时就得到了一个新的 “令牌”

1.2 理解会话机制 (Session)

服务器同一时刻收到的请求是很多的,服务器需要清除的区分清楚每个请求是从属于哪个用户,就需要在服务器这边记录每个用户令牌以及用户的信息的对应关系

在上面的例子中,就诊卡就是一张 “令牌”,要想让这个令牌能够生效,就需要医院这边通过系统记录
每个就诊卡和患者信息之间的关联关系


Cookie 是客户端存储数据的机制
在 cookie 中存储的用户身份标识,也经常会理解成 sessionId

Session 是服务器存储数据的机制(不算持久化存储)
服务器juice存储了很多的 session
每个用户都有一个自己的 session,也有不同的 sessionId

上面两个往往会相互配合使用的

服务器会通过类似于 hash 这样的键值对,来存储 session
sessionId 就是 key.session 本身就是 value
在session 里面又可以存储各种的用户自身的信息(也是程序员自定义的)
在这里插入图片描述


目前学到了大量的概念都是和“键值对”有关系

  1. query string
  2. header
  3. body (form)
  4. body (json)
  5. cookie
  6. session 本身就是通过键值对的方式管理
  7. session 里面存储的内容,也是通过键值对的方式组织的

通过 Servlet api 来操作上述结构
Cookie 是浏览器的机制,Servlet 提供了 api 获取到 Cookie
Session 是服务器的机制,Servlet 内部已经实现好了,也提供了 api 可以让我们进行使用

1.2.1 核心方法

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

  • getCookies()
    这个方法,拿到请求中所有 cookie 内容,每个 cookie 都是一个键值对
  • getSession()
    这个方法,就能够完成,从 cookie 中获得到 sessionId 并且查询出对应 session 的过程
    servlet 中,通过这个类表示一个会话,服务器同时具有多个会话
    服务器上就会存在一个类似于这样的
    在这里插入图片描述
    入股 sessionId 没有从 hash 喵查到,也嫩帮我们自定的创建出新的键值对(分配新的 sessionId,以及创建一个新的 HttpSession 对象)

HttpSession 类中的相关方法

一个 HttpSession 对象里面包含多个键值对,我们可以往 HttpSession 中存任何我们需要的信息

  • getAttribute(Stringname)
    该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null
    session 对象本身,也是一个键值对的形式
  • void setAttribute(Stringname, Object value)
    该方法使用指定的名称绑定一个对象到该 session 会话

通过这些键值对,就通过上述的这两个 Attribute 方法来完成
在这里插入图片描述

2. 用户登录

2.1 准备工作

我们通过 HttpSession 类完成一个用户登录界面

  1. 登录界面(html)
    发起一个 HTTP 请求,触发登录逻辑
    在这里插入图片描述
  2. 通过一个 servlet 处理上述的登录请求
    通过这个 Servlet 读取用户名和密码,并且验证是否登录成功
    如果登录成功,就会给当前这个用户,创建一个会话,并且把得到的 sessionId,通过 cookie 返回给客户端(客户端就把 cookie 保存起来了)
  3. 网站主页,通过另一个 servlet 生成的动态页面
    在这个界面中,就会把赶在这里的用户数据给显示到页面上

2.2 登录页面

在这里插入图片描述
在这里插入图片描述
此处预期发送的请求,是 POST login
Content-Type: application/x-www-form-urlencoded

username=zhangsan&password=123

使用form 表单,Content-Type 就是这种格式
此处的登录,使用 json 也可以,但是使用 json 就无法使用 form 表单了


浏览器构造 HTTP 请求,有这么几种凡是

  1. url 输入地址(GET)
  2. 特殊的 html 标签(.a,img,script)
  3. form 表达(GET,POST)
  4. ajax(GET,POST,PUT,DELETE…)

2.3 写一个 Servlet 处理上述登录请求

在这里插入图片描述
equals 内部能够针对 参数为 null 做好处理


在这里插入图片描述
这个方法就是根据 请求的 cookie 中的 sessionI的,查询服务器的 hash 表,找到对应的 session 对象
如果 cookie 中没有 sessionId(首次登录的时候,就是没有的)
或者 sessionId 没有查到对应的 session 对象
就可以创建出来一个 session 对象出来

参数为 true,允许在不存在时自动创建,参数为 false,不能创建,直接返回 null

会创建出一个 sessionId 和一个 session 兑现个,把这个键值对保存到 hash 表里,并且会把 session 设置到响应中(会在相应报头上加上 set-cookie 字段),传回给浏览器,让浏览器使用 cookie 来保存

这些操作,都是 servlet 在内部帮我们封装好了


在这里插入图片描述
这里使用 Attribute 的作用,主要就是为了让一个数据,在多个 servlet 之间共享
同时 Attribute 是会话级别的,每个用户/客户端 都是有自己的数据,相互之间都不会有干涉


在这里插入图片描述
如果这个 Servlet 是通过第一个浏览器调用的
此时Servlet 里面拿到的就是 zhangsan 这个 Session 对象,及其里面的数据

如果这个 Servlet 是通过第二个浏览器调用的
此时 Servlet 里面拿到的就是 lisi 这个 Session 对象,及其里面的数据

通过 sessionld 取会话对象.(两人浏览器,sessionld 不同)

同样的页面,不同用户看到的数据是不同的


重定向跳转到 index 页面上
在这里插入图片描述

2.4 实现登录后的主页

在这里插入图片描述
这里的 getSession 是根据 cookie 中的 sessionId 来查询 servlet 这里的 hash 表
参数设置成 false,如果查到了,就直接返回,没有查到,就返回 null

会话,就可以理解成“用户身份信息”体现
在通过登录操作,验证了用户身份之后,才能够创建会话
其他页面,没有做“验证身份”,不应该创建会话


在这里插入图片描述
getSession 操作内部 拿着 sessionId 来查询的,同一个 sessionId,就能拿到同一个 session 对象
在这里插入图片描述不同的 servlet 之间,数据的共享


在这里插入图片描述


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

3. 总结

cookie 和 session

浏览器首次访问到登录操作的时候,就会在服务器这边验证身份,验证通过,就会创建会话

服务器就会保存会话消息(hash)
客户端也会保存身份标识(sessionId)

后续浏览器在访问这个网站(网站的其他界面)都会带上 cookie(sessionId)
服务器不需要让浏览器重新登陆,也能识别出浏览器的用户身份信息

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

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

相关文章

[枚举涂块]画家问题

画家问题 题目描述 有一个正方形的墙,由N*N个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i, j)个位置的砖时, 位置(i-1, j)、…

劫持 PE 文件:新建节表并插入指定 DLL 文件

PE格式简介 PE(Portable Executable)格式,是微软Win32环境可移植可执行文件(如exe、dll、vxd、sys和vdm等)的标准文件格式。PE格式衍生于早期建立在VAX(R)VMS(R)上的COFF(Common Object File Format)文件格式。 Portable 是指对于不同的Windows版本和不同的CPU类型上…

UIToolKit使用心得

起因 因为那个uitoolkit自己写了一套graphView,所以想着来用用但是用完之后发现也不过如此 怎么构建自己的组件 我在继承Node之后想修改node的样式该怎么办呢是这样的。先用pick点击默认的node节点元素- 在pick默认创建的node节点之后,可以把它的uxml…

类的加载顺序问题-demo展示

面试的的时候经常会被问到包含静态代码块、实例代码块和构造器等代码结构的加载顺序问题,下面借用一个面试题,回顾一下类的代码加载顺序。 public class AooTest {public static void main(String[] args) {AooTest.f1();}static AooTest test1 new Ao…

RedisTemplate序列化

SpringBoot整合Redis,配置RedisTemplate序列化。如果使用StringRedisTemplate,那么不需要配置序列化,但是StringRedisTemplate只能存储简单的String类型数据,如图: 如果使用StringRedisTemplate存储一个常规对象&#…

步进电机为什么叫步进电机,内部结构是什么,工作原理是什么,有什么特点,什么用途。

问题描述:步进电机为什么叫步进电机,内部结构是什么,工作原理是什么,有什么特点,什么用途。 问题解答: "步进"一词表示电机按照固定的步进角度运动。步进电机以控制脉冲信号来驱动转子按照一定的…

3D视觉-相机选用的原则

鉴于不同技术方案都有其适用的场景,立体相机的选型讲究的原则为“先看用途,再看场景,终评精度”,合适的立体相机在方案中可以起到事半功倍的效果。从用途上来进行划分,三维视觉方案主要应用在两个方向:测量…

JavaScript中alert、prompt 和 confirm区别及使用【通俗易懂】

✨前言✨   本篇文章主要在于,让我们看几个与用户交互的函数:alert,prompt 和confirm的使用及区别 🍒欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍒博主将持续更新学习记录收获&…

PiflowX组件-WriteToUpsertKafka

WriteToUpsertKafka组件 组件说明 以upsert方式往Kafka topic中写数据。 计算引擎 flink 有界性 Streaming Upsert Mode 组件分组 kafka 端口 Inport:默认端口 outport:默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_h…

阿里开源大模型 Qwen-72B 私有化部署

近期大家都知道阿里推出了自己的开源的大模型千问72B,据说对于中文非常友好,在开源模型里面,可谓是名列前茅。 千问拥有有强大的基础语言模型,已经针对多达 3 万亿个 token 的多语言数据进行了稳定的预训练,覆盖领域、…

【Java】JUC并发编程(重量锁、轻量锁、偏向锁)

JUC并发编程 预备: 创建一个maven工程,导入lombok和logback的依赖。 1、基础概念 1、进程与线程 **进程:**程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU ,数…

Golang不可不知的7个并发概念

并发性支持是Golang最重要的原生特性之一,本文介绍了Golang中和并发性相关的7个概念。原文: Golang: 7 must-know concurrency related concepts 并发是Go编程语言的基本特性,意味着程序可以同时执行多个任务。Golang的并发独特而强大,其内置…

【Linux操作系统】探秘Linux奥秘:文件系统的管理与使用

🌈个人主页:Sarapines Programmer🔥 系列专栏:《操作系统实验室》🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。 目录 🪐1 初识Linux OS &…

【数据结构】栈和队列(队列的基本操作和基础知识)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​ 目录 前言 队列 队列的概念和结构 队列的…

二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)

目录 一、树概念及结构(了解) 1.1树的概念 1.2树的表示 二、二叉树概念及结构 2.1概念 2.2现实中的二叉树: 2.3数据结构中的二叉树: 2.4特殊的二叉树: 2.5 二叉树的存储结构 2.51 顺序存储: 2.5.2 链式存储&…

CSS2_基础学习

CSS2_基础学习 一、css基础知识二、css选择器2.0 选择器的优先级2.1 CSS基本选择器2.2 复合选择器2.2.1. 交集选择器2.2.2. 并集选择器2.2.3. 后代选择器(加空格)2.2.4. 子代选择器2.2.5. 兄弟选择器2.2.6. 属性选择器2.2.7. 伪类选择器2.2.8. 伪元素选择…

微信小程序发送模板消息-详解【有图】

前言 在发送模板消息之前我们要首先搞清楚微信小程序的逻辑是什么,这只是前端的一个demo实现,建议大家在后端处理,前端具体实现:如下图 1.获取小程序Id和密钥 我们注册完微信小程序后,可以在开发设置中看到以下内容&a…

navicat premium历史版本下载及更新navicat premium15 永久(使用)有效期

1、navicat premium介绍 Navicat Premium 是一套可创建多个连接的数据库开发工具,让你从单一应用程序中同时连接 MySQL、Redis、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 。它与 GaussDB 、OceanBase 数据库及 Amazon RDS、Amazon Aurora、Amaz…

基于简化版python+VGG+MiniGoogLeNet的智能43类交通标志识别—深度学习算法应用(含全部python工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Anaconda环境 模块实现1. 数据预处理 相关其它博客工程源代码下载其它资料下载 前言 本项目专注于解决出国自驾游特定场景下的交通标志识别问题。借助Kaggle上的丰富交通标志数据集,我们采用了VGG和G…

推荐系统中 排序策略 CTR 动态加权平均法

CTR(Click-Through Rate)动态加权平均法是一种用于计算广告点击率的方法,其中每个点击率被赋予一个权重,这个权重可以随着时间、事件或其他因素而动态调整。这种方法旨在更灵活地反映广告点击率的变化,使得最近的数据更…