Cookie 和 Session概念及相关API

目录

1.Cookie概念

2.理解会话机制 (Session)

3.相关API 

3.1HttpServletRequest

3.2HttpServletResponse

3.3HttpSession

3.4Cookie

4.代码示例: 实现用户登陆


1.Cookie概念

Cookie 是存储在用户本地终端(如计算机、手机等)上的数据片段。

它主要有以下一些特点和作用:

特点:

小型数据存储:通常用于存储少量的信息。

与特定网站关联:由访问的网站创建和管理。

作用:

用户识别:帮助网站识别用户身份,实现登录状态保持等功能。

个性化设置保存:比如记住用户的偏好设置。

跟踪用户行为:用于分析和优化网站体验。

然而,Cookie 也存在一些隐私方面的问题,可能会被用于跟踪用户的浏览行为等。用户可以在浏览器中对 Cookie 的使用进行一定程度的管理和控制。

在实际开发中,我们很多时候是需要知道请求之间的关联关系的

例如登陆网站成功后, 第二次访问的时候服务器就能知道该请求是否是已经登陆过了.

图中的 "令牌" 通常就存储在 Cookie 字段中

1. 例如到了医院先挂号. 挂号时候需要提供身份证, 同时得到了一张 "就诊卡", 这个就诊卡就相当于患者的 "令牌".

2. 后续去各个科室进行检查, 诊断, 开药等操作, 都不必再出示身份证了, 只要凭就诊卡即可识别出当前患者的身份.

3. 看完病了之后, 不想要就诊卡了, 就可以注销这个卡. 此时患者的身份和就诊卡的关联就销毁. (类似于网站的注销操作)

4. 又来看病, 可以办一张新的就诊卡, 此时就得到了一个新的 "牌"

此时在服务器这边需要记录令牌信息, 以及令牌对应的用户信息, 这就是 Session 机制所做的工作

2.理解会话机制 (Session)

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

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

会话的本质就是一个 "哈希表", 存储了一些键值对结构. key 就是令牌的 ID(token/sessionId), value 就是 用户信息(用户信息可以根据需求灵活设计).

sessionId 是由服务器生成的一个 "唯一性字符串", session 机制的角度来看, 这个唯一性字符串称为 "sessionId"..在整个登录流程中看待, 也可以把这个唯一性字符串称为 "token".

当用户登陆的时候, 服务器在 Session 中新增一个新记录, 并把 sessionId / token 返回给客户端. (如通过 HTTP 响应中的 Set-Cookie 字段返回).

客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId/ token. (例如通过 HTTP 请求中的 Cookie 字段带上).

服务器收到请求之后, 根据请求中的 sessionId / token Session 信息中获取到对应的用户信息,再进行后续操作.

Servlet Session 默认是保存在内存中. 如果重启服务器则 Session 数据就会丢失.

3.相关API 

3.1HttpServletRequest

方法

描述

HttpSession  getSession()

在服务器中获取会话. 参数如果为 true, 则当不存在会话时新建会话; 参数如果false, 则当不存在会话时返回 null

Cookie[]  getCookies()

返回一个数组, 包含客户端发送该请求的所有的 Cookie 对象. 会自动把 Cookie 中的格式解析成键值对.

3.2HttpServletResponse

方法

描述

void addCookie(Cookie cookie)

把指定的 cookie 添加到响应中.

3.3HttpSession

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

方法

描述

Object getAttribute(String name)

该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null.

void setAttribute(String name, Object value)

该方法使用指定的名称绑定一个对象到该 session 会话

boolean isNew()

判定当前是否是新创建出的会话

3.4Cookie

每个 Cookie 对象就是一个键值对.

方法

描述

String getName()

该方法返回 cookie 的名称。名称在创建后不能改变。(这个值是 Set- Cooke 字段设置给浏览器的)

String getValue()

该方法获取cookie 关联的值

void setValue(String newValue)

该方法设置cookie 关联的值。

HTTPCooke 字段中存储的是多组键值对. 每个键值对在 Servlet 中都对应了一个 Cookie 对象

通过 HttpServletRequest.getCookies()  获取到请求中的一系列 Cookie 键值对.  

通过 HttpServletResponse.addCookie()  可以向响应中添加新的 Cookie 键值对.

4.代码示例: 实现用户登陆

实现简单的用户登陆逻辑,代码主要是通过HttpSession完成. 不需要我们手动操作 Cookie对象.

1. 创建 IndexServlet 

@WebServlet("/index")
public class IndexServlet extends HelloServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html; charset=utf-8");// 1. 判定当前用户是否已经登陆HttpSession session = req.getSession(false);if (session == null) {// 用户没有登陆 , 重定向到 login.htmlresp.sendRedirect("login.html");return;}// 2. 如果已经登陆 , 则从 Session 中取出访问次数数据String userName = (String) session.getAttribute("username");String countString = (String) session.getAttribute("loginCount");int loginCount = Integer.parseInt(countString);loginCount += 1;session.setAttribute("loginCount", loginCount + "");// 3. 展示到页面上 .StringBuilder html = new StringBuilder();html.append(String.format("<div>用户名: %s</div>", userName));html.append(String.format("<div>loginCount: %d</div>", loginCount));resp.getWriter().write(html.toString());}
}

2. 创建 login.html, 放到 webapp 目录中

<form action="login" method="POST"><input type="text" name="username"><input type="password" name="password"><input type="submit" value="提交">
</form>

3. 创建 LoginServlet 

@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setContentType("text/html; charset=utf-8");// 1. 获取到用户提交的用户名和密码String username = req.getParameter("username");String password = req.getParameter("password");// 2. 判定用户名密码是否正确if (!username.equals("admin") || !password.equals("123")) {// 登陆失败resp.getWriter().write("登陆失败");return;}// 登陆成功System.out.println("登陆成功");// 设置 SessionHttpSession session = req.getSession(true);session.setAttribute("username", "admin");session.setAttribute("loginCount", "0");resp.sendRedirect("index");}
}

此处的 getSession 参数为 true, 表示查找不到 HttpSession 时会创建新的 HttpSession 对象, 生成一个 sessionId, 插入到哈希表中, 并且把 sessionId 通过 Set-Cookie 返回给浏览器.

 4. 部署程序 

通过 http://127.0.0.1:8080/ServletHelloWorld/index 访问.

首次访问的时候可以看到, 当前用户尚未登陆, 此时页面自动重定向到 login.html

抓包结果显示:

login.html 中输入用户名密码之后, 会跳转到  /login . 此时服务器返回了一个 token, 并在 Session 中记录用户信息, 然后重定向到 /index

抓包结果:

注意: 响应中的 302表示重定向,其中JSESSIONIDServlet 自动生成的 token

  /index, 通过 Session 拿到了用户信息, 进一步获取到用户的访问次数. 

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

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

相关文章

HTML5 3D图像应用

目录 关键技术与规范应用示例与领域相关工具与框架HTML5 3D图像应用是利用HTML5、CSS3、JavaScript(及其相关的库和框架)以及其他现代Web技术(如WebGL)构建的,能够在浏览器中呈现三维图形、动画和交互式场景的应用程序。以下是一些关于HTML5 3D图像应用的关键点和示例: …

反射获取或修改对象属性的值

利用反射既可以获取也可以写入&#xff0c;首先咱们先写几个获取的例子。 一&#xff1a;利用反射修改各数据(利用resultField.set修改) 首先定义实体类 public class Dog {private String dogUser;private int age;把DogUser的"hahaha"改为"geggegegege&quo…

11、设计模式之外观模式

外观模式 外观模式&#xff08;Facade Pattern&#xff09;隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式&#xff0c;它向现有的系统添加一个接口&#xff0c;来隐藏系统的复杂性。 这种模式涉及到一个单一的…

LiveGBS流媒体平台GB/T28181用户手册-版本信息:查看机器码、切换查看流媒体服务

LiveGBS流媒体平台GB/T28181用户手册--版本信息:查看机器码、切换查看流媒体服务 1、版本信息1.1、查看机器码1.2、多个流媒体服务1.3、提交激活 2、搭建GB28181视频直播平台 1、版本信息 版本信息页面&#xff0c;可以查看到信令服务 流媒体服务相关信息&#xff0c;包含硬件…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

小程序丨数据功能如何使用

查询发布完成后&#xff0c;如发现信息有误或想要修改信息&#xff0c;老师可以使用数据功能在线修改已发布的查询内容。 数据功能包含导出、添加、编辑、更多操作&#xff0c;下面来教大家如何使用吧。 &#x1f4cc;使用教程 数据功能主要用于在线修改已发布的查询内容&#…

Day2 数组小结

数组的性质 1、数组的小标从0开始且地址连续 2、数组定位元素的效率非常高&#xff0c;几乎是O(n)的时间复杂度&#xff0c;因此查找很快 3、因为内存连续&#xff0c;因此进行删除或者添加的话&#xff0c;需要移动后面的元素 4、二维数组空间并不是连续的&#xff0c;如{{1,…

【LGR-187-Div.4】洛谷入门赛 #23

原题链接&#xff1a;题目列表 - 洛谷 B3970~B3977为A~H题 目录 A. 数字取模 B. 闰年 C. 二进制 D. 小 S 大战小 Q E. 放行李 F. 最大的和 G. 交题解 H. 更好的交换 A. 数字取模 直接模拟即可。将数字x的每一位都开一个变量存起来&#xff0c;再分别让每个变量对k取…

C语言 | Leetcode C语言题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; struct TreeNode* helper(int* nums, int left, int right) {if (left > right) {return NULL;}// 选择任意一个中间位置数字作为根节点int mid (left right rand() % 2) / 2;struct TreeNode* root (struct TreeNode*)malloc(sizeo…

ElasticSearch IK分词器的安装、词典扩展与停用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;云原生与服务部署-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 ​编辑 1. 前言 2. IK分词器安装 3. IK分词器词典扩展与停用 4. 总…

汽车整车检测的原由(北重试验平台制造厂家)

汽车整车检测是指对整车系统和构造各部分的性能、可靠性、安全性等方面进行全面检查和评估的过程。它是在汽车生产制造和销售使用环节中&#xff0c;为了保障驾驶安全和质量而必不可少的一项检测和评估工作。 1. 提升行车安全 汽车整车检测能够全面评估车辆的性能和安全性&…

音视频-常用的分析工具介绍-连续补充

目录 1&#xff1a;Audacity 2&#xff1a;MediaInfo 3&#xff1a;MP4Box 4&#xff1a;hexinator 5&#xff1a;Adobe Audition 6&#xff1a;VideoEye 7&#xff1a;YUVplayer &#xff08;YUV/RGB播放器&#xff09; 在做音视频分析时&#xff0c;经常用到各种分析工…

【无标题】思科交换路由中路由引入实验指南

路由引入是网络设计中的一个重要概念&#xff0c;它允许不同路由协议之间的路由信息交换。在思科网络设备中&#xff0c;路由引入可以增强网络的连通性和效率。本文将介绍路由引入的基本概念&#xff0c;并通过一个实验来演示如何在思科路由器中实现路由引入。 ## 路由引入的基…

头歌05-子集树实验-01背包

""" 题目&#xff1a;有n个重量分别为w{w_1,w_2,…,w_n}的物品&#xff0c;他们的价值分别为v{v_1,v_2,…,v_n}&#xff0c;给定一个容量为G的背包。 设计从这些物品中选取一部分物品放入该背包的方案&#xff0c;每个物品要么选中要么不选中&#xff0c;要求选…

读书笔记整理

1.对天才而言&#xff0c;任何努力都如做游戏般容易和有趣&#xff0c;兴趣是发展的原动力。从这个角度来看&#xff0c;通过普通人的劳动是无法创造天才的。 2.让孩子理解语法是很困难的。苦背不如练才是行之有效的办法。孩子们永远是故事迷&#xff0c;在教孩子们外语时&…

sqlserver查看正在执行的语句,锁,内存,cpu占用多等

sqlserver查看正在执行的语句 SELECT [Spid] session_Id ,ecid ,[Database] DB_NAME(sp.dbid) ,[User] nt_username ,[Status] er.STATUS ,[Wait] wait_type ,[Individual Query] SUBSTRING(qt.TEXT, er.statement_start_offset / 2, ( CASE WHEN er.statement_end_offs…

【有手就行】使用你自己的声音做语音合成,CPU都能跑,亲测有效

此文介绍在百度飞桨上一个公开的案例&#xff0c;亲测有效。 厌倦了前篇一律的TTS音色了吗&#xff1f;打开短视频听来听去就是那几个声音&#xff0c;快来试试使用你自己的声音来做语音合成吧&#xff01;本教程非常简单&#xff0c;只需要你能够上传自己的音频数据就可以(建议…

OpenLayers中实现对ImageStatic图层的扩展以支持平铺WrapX功能

地图平铺技术概述 地图平铺&#xff08;Tiling&#xff09;是一种将大尺寸地图数据分割成小块&#xff08;瓦片&#xff09;的技术&#xff0c;这在地图服务中非常常见。它使得地图数据能高效加载和展示&#xff0c;尤其适合网络环境。通过仅加载当前视图窗口所需的地图瓦片&a…

Spring Boot Web 开发:MyBatis、数据库连接池、环境配置与 Lombok 全面解析

推荐一个AI网站&#xff0c;免费使用豆包AI模型&#xff0c;快去白嫖&#x1f449;海鲸AI 1.0 MyBatis 概述 MyBatis 是一个优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 可以帮助我们将数据库操作抽象出来&#xff0c;使得我们的代码更加简洁…

SERVER ——查询(二)

目录 5. top 6. null 7. order by 8. 模糊查询&#xff1a; 9. 聚合函数 5. top top查询&#xff1a;查询表的前几行&#xff1b;下面是代码演示&#xff1a; --top&#xff08;前面的几个记录&#xff09; select top 2 * from emp; --查询表的前两列 select top 20 percent *…