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,一经查实,立即删除!

相关文章

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

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

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;使用教程 数据功能主要用于在线修改已发布的查询内容&#…

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;经常用到各种分析工…

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

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

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

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

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 *…

MoonDream2微调指南【最小VLM】

在本指南中&#xff0c;我们将探讨如何使用计算机视觉数据集对完全开源的小型视觉语言模型 Moondream2 进行微调&#xff0c;以计数项目&#xff08;这是 GPT-4V 一直表现不一致的任务&#xff09;&#xff0c;并以一种可以依赖输出用于生产应用程序的方式进行微调。 视觉语言…

FFmpeg操作命令 - 精简版

PS&#xff1a;&#xff08;因为我只需要简单的操作&#xff0c;所以我整理出了这份笔记&#xff09; 原网址&#xff1a;30分钟带你入门&#xff0c;20个 FFmpeg操作命令&#xff0c;包你学会 - 知乎 大佬零声Github整理库整理的笔记非常的全面&#xff0c;想看完整版去上面…

求二叉树的最大深度(oJ题)

一、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二、题目思路 如果结点为空&#xff0c;则返回0。否则该树的深度为 :左子树 和右子树 中深度大的那个再加上1&#xff0c;依次类推&#xff0c;递归下去 三、题目代码 //树的深度计算方法是: 左子树 和…

MySql:多表设计-关联查询

目录 多表设计 代码 运行 数据库设计范式 设计三范式 1、第一范式&#xff1a; 2、第二范式&#xff1a; 3、第三范式&#xff1a; 多表设计_关联查询 外键 外键约束 代码 运行 注意&#xff1a; 应用 代码 运行 代码 运行 关联查询 含义&#xff1a; …

Unity修改Project下的Assets的子文件的图标

Unity修改文件夹的图标 示例&#xff1a; 在右键可以创建指定文件夹。 github链接 https://github.com/SeaeeesSan/SimpleFolderIconCSDN资源的链接 https://download.csdn.net/download/GoodCooking/89347361 去GitHub下载支持原作者哦。重要的事情 截图来自GitHub 。 U…

【高阶数据结构】跳表

文章目录 跳表1. 什么是跳表-skiplist2. skiplist的效率如何保证&#xff1f;3.skiplist的实现4.skiplist跟平衡搜索树和哈希表的对比 跳表 1. 什么是跳表-skiplist skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价…

Docker安装MongoDB(Linux版)

文章目录 前言一、Docker环境的准备1.安装依赖2.安装Docker 二、使用Docker安装MongoDB1.mongo版本选取2.拉取合适的镜像3.宿主机创建MongoDB需要挂载的文件夹4.第一次无认证创建mongo用户5.启动需要认证的mongo容器 问题汇总总结 前言 本文章主要介绍在Centos系统&#xff0c…

java中的TreeMap类和Hashtable类+Map集合遍历+集合小结

一、TreeMap类 实现了Map接口&#xff0c;元素为键值对、键不可重复、值可重复 特点&#xff1a;可排序 要求&#xff1a;Key类必须实现Comparable接口 底层结构&#xff1a;红黑树 1、可排序 2、常用方法 与HashMap一致 二、Hashtable类 实现了Map接口&#xff0c;元素…

【Qt】如何优雅的进行界面布局

文章目录 1 :peach:写在前面:peach:2 :peach:垂直布局:peach:3 :peach:水平布局:peach:4 :peach:网格布局:peach:5 :peach:表单布局:peach: 1 &#x1f351;写在前面&#x1f351; 之前使⽤ Qt 在界⾯上创建的控件, 都是通过 “绝对定位” 的⽅式来设定的。也就是每个控件所在…