javaEE 初阶 — Cookie 与 Session

news2024/10/3 6:36:00

文章目录

  • Cookie 的四个问题
  • Cookie 的典型应用
  • Cookie 与 Session 的区别
  • 代码示例体现两者的关联关系
    • 1. 设计思路
    • 2. 编写前端登录页面
    • 3 编写 LoginServlet 处理登录请求
      • 3.1 服务器是如何组织会话的
    • 4. 编写 IndexServlet 生成主页
      • 4.1 抓包观察交互过程

Cookie 的四个问题


1、Cookie 是什么?

这里是浏览器提供的持久化存储数据的机制。


2、Cookie 从哪里来?

Cookie 是从服务器返回给浏览器的。
服务器代码中由程序员决定要把什么样的信息保存到客户端这边。
通过 HTTP 响应的 Set-Cookie 字段,把键值对写回去即可。


3、Cookie 到哪里去?

Cookie 会在后续浏览器访问服务器的时候带到请求的 header 中发给服务器。


4、Cookie 会存储在哪里?

存储在浏览器(客户端)所在主机的硬盘中,浏览器会根据域名来分别存储。

Cookie 的典型应用


Cookie 的应用是有很多的,这里的指的应用是 标识用户的身份信息



一开始登录的时候,服务器是不知道我的身份信息的,这个时候淘宝会查询数据库,验证用户名和密码是否正确。

如果正确,则登录成功,淘宝就会把当前用户的身份信息在内存中也保存一份,
同时会给这个用户分配一个表示身份的序号,这个序号是唯一的,可以是整数或者字符串。
把生成的唯一身份序号称为 sessionld

服务器会使用像 hash 表这样的结构把序号作为 key,身份信息作为 value 存储起来。
服务器把生成的这些键值对称为 session(会话)

在后续的请求中,服务器收到 Cookie 中的身份序号,就会查询上述的 hash 表,判定用户是谁。
如果查到了,就知道用户是谁了,这是为了避免重复输入账号和密码
如果没查到,就会要求用户重新登录。

所谓的过期,可能只是客户端把 cookis 删除了,也可能是服务器把对应的身份信息删了。

凡是越敏感(花钱)的网页,就越是需要设定过期,比方说,有人在公共电脑上登陆了淘宝,
下机的时候,没有手动点击注销,下一个使用你这个电脑人就能看到你的登录状态。

Cookie 与 Session 的区别


Cookie 是客户端的存储机制,Session 是服务器的存储机制。
Cookie 不仅可以存键值对,还可以存别的,Session 则是专门用来保护用户的身份信息的。

Cookie 完全可以在不搭配 session 的情况下单独使用(实现非登录场景)
Session 也可以不搭配 Cookie 使用。(手机 app 登录服务器,服务器也需要 Session,此时就没有 Cookie 的概念) Cookie 跟浏览器强相关的。

Cookie 是属于 HTTP 协议中的一个部分,
Session 则是可以和 HTTP 无关(TCP、websocket…也可以用 session)

代码示例体现两者的关联关系

1. 设计思路




这个示例中涉及到了两个页面:

1、登录页面

2、主页面


还涉及到了两个 Servlet:

1、处理登录的 LoginServlet 判定用户名密码

2、构造主页面的 IndexServlet

2. 编写前端登录页面


首先要在 webapp 目录下建一个 login.html 文件,选择 vscode 打开。

在这个文件里编写前端页面的代码。

<body>
    <form action="login" method="post">
        <input type="text" name="usernmae">
        <br>
        <input type="password" name="password">
        <br>
        <input type="submit" value="提交">
    </form>
</body>
</html>


启动服务器,在地址栏输入路径查看效果。



接下来抓包观察结果。



这里的 POST 与 login 就对应上面代码中的 action 和 method 属性里的值。
由于我们仅仅只是实现了一个前端页面,所以此处汇报一个 404 错误。

3 编写 LoginServlet 处理登录请求


首先要创建一个 login 包,在这个包里创建一个 LoginServlet 类。

1、获取用户名和密码

在这里插入图片描述

这里的两个字符串要对应到前端代码中的 input 标签中的 name 属性的值。
注解里的值要对应上 form 标签里的 action 属性的值,也就是 login。


2、验证用户名和密码是否正确

if (!username.equals("zhangsan")) {
    // 登录失败!!!
    // 重新定向到登录页面
    System.out.println("登录失败,用户名错误!!!");
    resp.sendRedirect("login.html");
    return;
}
if (!password.equals("123456")) {
    // 登录失败!!!
    // 重新定向到登录页面
    System.out.println("登录失败,密码错误!!!");
    resp.sendRedirect("login.html");
    return;
}


此处直接规定一个用户名和密码,用户名: zhangsan;密码 : 123456


3、登陆成功的操作

// 登录成功!!!
// 1.创建一个会话
HttpSession session = req.getSession(true);
// 2.把当前的用户名保存到会话中,此处的 HttpSession 又可以当做一个 map 来使用
session.setAttribute("username", username);
// 3.重定向到主页
resp.sendRedirect("index");


第一步创建一个会话,所谓的 会话 是一个键值对,key 是 sessionld,value 是 HttpSession 对象。

每个客户端登陆的时候都有一个这样的键值对,也就是会话。
服务器要管理多个这样的会话,服务器可以搞一个哈希表,把这些会话组织起来。

HttpSession session = req.getSession(true);


getSession(true) 表示判定当前的请求是否有对应的会话了,也就是拿着请求中的 cookie 里的sessionld 查一下哈希表。

如果 sessionld 不存在,或者没查到就会创建新会话,并插入到哈希表中。
如果查到了,就直接返回插到的结果。

创建新会话的过程

1.构造一个 HttpSession 对象
2.构造唯一的 sessionld
3.把这个键值对插入到哈希表
4.把 sessionld 设置到响应报文 Set-Cookie 字段中。

3.1 服务器是如何组织会话的




上图中的最外层矩形代表一个服务器,每一个 会话 都是由 key 和 value 组成的。
每个会话是一个键值对,对应到一个客户端,服务器这里可以对应到多个客户端,也就是多组会话。

每个会话对象里还可以存储一些程序员自定义的数据,以键值对形式组织的。

4. 编写 IndexServlet 生成主页


首先要在 Login 目录下创建一个 IndexServlet 类。



这里的注解要和 LoginServlet 类中的重新定向到主页是一致的。

@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 先判定用户的登录状态
        // 如果用户还没登录,要求先登录
        // 如果已经登录了,则根据 会话 上的用户名来显示到页面上
        HttpSession session = req.getSession(false);
        if (session == null) {
            // 此时未登录
            System.out.println("用户未登录!");
            // 返回到登录页面
            resp.sendRedirect("login.html");
            return;
        }
        // 此时为登录
        String username = (String)session.getAttribute("username");
        // 构造页面
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write("欢迎" + username + "回来!");
    }
}


String username = (String)session.getAttribute(“username”);
这条语句,是用来获取登录的用户名的,前提是前面的登录操作中存过。

由于 HttpSession value 的类型是 Object 类型,需要手动强制类型转成 String。



username 是在 LoginServlet 中保存好的,根据同一个 sessionId 得到了同一个 HttpSession 对象。

4.1 抓包观察交互过程




上述的登录过程就像是去医院看病一样。

首次到达医院,需要挂号办理就诊开。(类似于登录、创建会话、分配 sessionId)
你的身份信息就进入医院的系统了,发出来的就诊卡里就包含了你的 sessionId

后续去具体的科室检查的时,比如说进入内科,医生开始检查,检查信息就进入了系统,相当于是我的 HttpSession 中设置了一些 attribute。
来到检验科抽血时,也是先刷卡,医生把抽血的结果也是设置到系统中的。在我的 HttpSession 中又设置了一些 attribute。
来到影像科室拍片时,医生也是先刷卡,也是把拍片结果设置到系统中。
再次回到内科的时候,医生直接就在系统上看到结果了。

每次刷卡都是拿着我的 sessionId 来查系统,获取到会话对象进一步得到里面的 attribute,
就知道要哪些检查和结果是什么了。

你的就诊卡就是 cookie 里面存的就是 sessionId。

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

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

相关文章

Doris(25):Doris的函数—Bitmap函数

1 BITMAP_AND(BITMAP lhs, BITMAP rhs) 计算两个输入bitmap的交集,返回新的bitmap. select bitmap_count(bitmap_and(to_bitmap(1), to_bitmap(2))) cnt; select bitmap_count(bitmap_and(to_bitmap(1), to_bitmap(1))) cnt; 2 BITMAP_CONTAINS(BITMAP bitmap, BIGINT input…

VGAM | tobit模型

专注系列化、高质量的R语言教程 推文索引 | 联系小编 | 付费合集 本篇来介绍tobit模型&#xff0c;使用的工具包是VGAM。 library(VGAM) 目录如下&#xff1a; 1 Tobit分布2 tobit模型3 运行模型 例1例2例34 其他 1 Tobit分布 tobit模型主要应用于因变量存在删失的情况。以正态…

交换机-Exchanges

交换机 Exchanges 概念 RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上&#xff0c;通常生产者甚至都不知道这些消息传递传递到了哪些队列中。相反&#xff0c;生产者只能将消息发送到交换机(exchange)&#xff0c;交换机工作的内容非常简…

Threejs进阶之十:让模型移动到鼠标点击的指定位置

上一节中我们实现了物体沿指定轨迹移动的动画效果&#xff0c;这一节我们来实现让模型移动到鼠标点击的制定位置的动画效果。 先看下实现后的最终效果 要实现上面的动画效果&#xff0c;我们需要通过以下步骤来实现 第一步&#xff0c;监听鼠标事件 我们需要监听鼠标的点击事…

2 ROS2话题通讯基础(2)

ROS2话题通讯基础 2.5 自定义话题通讯2.5.1 自定义话题通讯的一般流程2.5.2 创建自定义话题消息简单例子2.5.3 快速创建C/C和Python自定义话题通讯的Student.msg 2.6 使用C/C实现自定义话题通讯2.6.1 创建C/C自定义话题发布方功能包并编写节点文件2.6.2 配置C/C自定义话题发布方…

如何选择适合企业的网盘?必须要考虑这几个方面

随着云存储技术的发展&#xff0c;传统的文件存储服务已逐渐不能满足企业日益增长的文件应用、共享和存储需求。越来越多的企业开始将目光转移到企业网盘上。 在选择企业网盘工具时&#xff0c;比较重要的有两个方面&#xff0c;一个是数据的安全性&#xff0c;一个是协同办公。…

Java 将增加虚拟线程,挑战 Go 协程

Java19 正式发布&#xff0c;带来了一个 Java 开发者垂涎已久的新特性 —— 虚拟线程。在 Java 有这个新特性之前&#xff0c;Go 语言的协程风靡已久&#xff0c;在并发编程领域可以说是叱咤风云。随着国内 Go 语言的快速发展与推广&#xff0c;协程好像成为了一个世界上最好语…

K8S二进制单节点 一键部署K8S_V1.21.x

1、安装前注意事项 安装shell脚本在文章最后位置 1、提前配置静态IP 把脚本的IP 192.168.1.31 换成你的IP 2、创建安装包路径 /home/software/shell 所有的tar包 shell脚本 放在这里 3、免密登录配置所有节点 提前下载镜像如下&#xff1a; [rootmaster01 ~]# docker image…

Ubuntu搜狗输入法安装指南

Ubuntu搜狗输入法安装指南 Ubuntu搜狗输入法安装指南搜狗输入法已支持Ubuntu1604、1804、1910、2004、2010Ubuntu20.04及以上安装搜狗输入法步骤 Ubuntu搜狗输入法安装指南 下载地址&#xff1a;https://shurufa.sogou.com/ 计算为amd64的选择x86_64&#xff0c;以下教程来源…

ORBBEC(奥比中光)AstraPro相机在ROS2下的标定与D2C(配准与对齐)

文章目录 1.rgb、depth相机标定矫正1.1.标定rgb相机1.2.标定depth相机1.3.rgb、depth相机一起标定&#xff08;效果重复了&#xff09;1.4.取得标定结果1.4.1.得到的标定结果的意义&#xff1a;1.5.IR、RGB相机分别应用标定结果1.5.1.openCV应用标定结果1.5.2.ros2工程应用标定…

[stable-diffusion-art] 指北-2 如何为sd提出好的prompt

https://stable-diffusion-art.com/how-to-come-up-with-good-prompts-for-ai-image-generation/https://stable-diffusion-art.com/how-to-come-up-with-good-prompts-for-ai-image-generation/1.prompt可以促使模型生成以前不存在的高质量的图片&#xff0c;例如&#xff1a;…

windows如何使用脚本打开多个软件

文章目录 windows如何使用脚本打开多个软件问题缘由省流版本制作脚本步骤新建文本找到文件的安装位置方法一&#xff1a;方法二&#xff1a; 总结 windows如何使用脚本打开多个软件 问题缘由 因为强迫症&#xff0c;不想让软件自启&#xff0c;会导致开机变慢&#xff0c;电脑…

Lecture7 处理多维特征的输入(Multiple Dimension Input)

以实际代码出发&#xff0c;逐行讲解。 完整代码&#xff1a; import numpy as np import torch import matplotlib.pyplot as plt# load data xy np.loadtxt(C:\\Users\\14185\\Desktop\\diabetes.csv, delimiter,, dtypenp.float32) x_data torch.from_numpy(xy[:, :-1])…

226. 翻转二叉树【58】

难度等级&#xff1a;容易 上一篇算法&#xff1a; 543. 二叉树的直径【71】 力扣此题地址&#xff1a; 226. 翻转二叉树 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;226. 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返…

DAY 52 LVS+Keepalived群集

Keepalived工具介绍 普通集群容易出现的问题 企业应用中&#xff0c;单台服务器承担应用存在单点故障的危险。 单点故障一旦发生&#xff0c; 企业服务将发生中断&#xff0c;造成极大的危害。 Keepalived工具 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&…

v2c - 从Verilog 转换到 C语言的工具

文章目录 一、如何安装1.下载二进制文件2.基准测试 二、如何使用v2c的应用描述工具流程使用 v2c 转换器的工作示例 三、注意事项情形一&#xff1a;拼接&#xff1a;{4{x}}情形1-1 y&{x&#xff0c;x&#xff0c;x&#xff0c;x}情形1-2 y&{x&#xff0c;x&#xff0c;…

【C++】string 类的实现

目录 构造函数赋值重载关于浅拷贝 迭代器容量相关reserveresize 修改push_backappendinserterase关于npos 流运算符重载流插入流提取 构造函数 无参数构造和传参构造 通过对参数设置缺省值为空串""同时满足无参构造和传参构造成员 _size 和 _capacity 均是针对有效…

自动驾驶—连续系统LQR最优控制的黎卡提方程推导

1. Why use the Riccati equation? 最优控制算法LQR是Linear Quadratic Regulator的缩写,Q、R就是需要设计的半正定矩阵和正定矩阵。考虑根据实车的情况去标定此参数,从理论和工程层面去理解,如果增大Q、减小R,则此时控制系统响应速度比较快速(比较剧烈),直观反映方向…

5月1日 9H45min|5.2 8H20min+30min|时间轴复盘

8:00 起床 8:00-8:30 洗漱吃饭 8:30-10:40 temporary pools阅读真题精读 (真的很慢了 不知道什么原因 感觉也没有彻底完全弄懂)【2h+10min】 10:40-11:10 午餐+酸奶(423+174KJ) 11:20-12:30 三篇阅读【1h+10min】 13:10-14:50 健身 14:50-15:45诵默写list…

Ae:画笔工具

画笔工具 Brush Tool 快捷键&#xff1a;Ctrl B 画笔工具 Brush Tool仅能工作在图层 Layer面板上。 双击纯色图层、像素图层等可打开图层面板。 在 Ae 中的每次画笔绘制都将新建一条路径&#xff0c;然后通过对路径的描边来显示绘制结果&#xff0c;故又称为“绘画描边”或“…