当前位置: 首页 > news >正文

通过Cookie和Session来实现网站中登录账号的功能

文章目录

  • 一、Cookie和Session
  • 二、基于Cookie和Session实现登录账号的功能
    • 2.1步骤一
    • 2.2步骤二
    • 2.3步骤三
    • 2.4总结通过Cookie和Session来实现登录功能
    • 2.5运行截图

一、Cookie和Session

cookie是http请求header中的一个属性,是浏览器持久化存储数据的一种机制,因为网页无法直接访问浏览器所在主机的文件系统,所以网页要通过向cookie中存储键值对(Cookie中的键值对是程序员自定义的)的方式来把数据存储到浏览器所在主机的硬盘中。
cookie中保存的是键值对,最终还是要把这个键值对发送回服务器,因为服务器要使用cookie中的键值对来完成一些业务逻辑。
比如客户端请求中的cookie包含个人id,服务器就会通过这个个人id在数据库中查询出来这个个人id所关联的信息。
然而每个人都有一个个人id和个人id所关联的信息。这些数据是存储在数据库中的,服务器代码执行过程中这些数据会先临时保存到某个内存结构(相当于一个哈希表)中,后续需要对这些信息进行修改时,就修改内存结构(哈希表)中的内容,然后再将修改后的信息写入数据库。
这里服务器所涉及到的内存结构(哈希表)叫“会话”(session)。

cookie是客户端存储数据的机制。
session是服务器存储数据的机制(不是持久化存储)。
在Cookie键值对中存储的用户身份标识经常会理解成sessionId(会话Id)。
服务器会存储很多的session信息(会话信息)和sessionId(会话Id),每个用户都有一个session信息以及sessionId。服务器会通过类似于哈希表这样的数据结构来存储session信息和sessionId,sessionId就是key,session信息就是value,session信息里可以存储用户自身的各种信息(session信息里也是程序员自定义的键值对)。

二、基于Cookie和Session实现登录账号的功能

2.1步骤一

浏览器发起html请求,服务器返回html登录页面,用户输入用户名和密码点击提交之后,浏览器会发送登录请求。

用前端代码写登录页面,通过from表单来构造post请求,用户在方框中输入用户名和密码点击登录后,前端就会向服务器发起一个post请求,用户输入的用户名和密码就会成为post请求的url中query string里的两个键值对,这时这个post请求的body格式就会自动设置成Content-Type: application/x-www-form-urlencoded这样的格式,而不需要我们手动设置。from表单也可以构造get请求,而这里不用get请求是因为get请求会把用户的用户名和密码显示到浏览器地址栏里,所以用GET请求不太好。

从上面可以看出客户端发送的请求是post请求,body类型为Content-Type: application/x-www-form-urlencoded。这是前后端交互时要约定好的。

以下为登录页面的前端代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登陆</title>
</head>
<body>
<!-- 使用 form 表单, 实现登陆效果 -->
<form action="login" method="post"><input type="text" name="username"><input type="text" name="password"><input type="submit" value="登陆">
</form>
</body>
</html>

2.2步骤二

服务器通过一个Servlet处理上述登录请求,即通过一个Servlet读取用户名和密码并且验证是否登录成功。如果登录成功就给当前用户创建一个session信息(会话信息)和sessionId(会话Id),然后Servlet把这个sessionId和session信息保存到服务器的哈希表中,并且Servlet把sessionId设置到重定向响应中传回给浏览器(即在重定向响应头中加上Set-Cookie字段),然后浏览器通过Cookie里面的键值对来保存sessionId的值(sessionId=……),然后sessionId的值就被保存到浏览器本地中了。
服务器的Servlet代码如下:

@WebServlet("/login")
public class LoginServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if(!"lingliang".equals(username) || !"123".equals(password)) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("用户名或密码错误");return;}HttpSession session = req.getSession(true);session.setAttribute("username", username);session.setAttribute("loginTime", System.currentTimeMillis());resp.sendRedirect("index");}
}

HttpSession session = req.getSession(true);这行代码会根据请求的cookie键值对中的sessionId查询服务器的哈希表来找对应的session信息对象,如果请求的cookie键值对中没有sessionId(比如首次登录的时候会没有),或者在服务器哈希表中没有查到sessionId对应的session信息对象,就会创建出一个新的session信息对象出来(如果没有sessionId的话也会创建出与session信息对象相对应的sessionId)。

然后Servlet把这个sessionId和session信息对象保存到服务器的哈希表中,并且Servlet会把sessionId设置到重定向响应中传回给浏览器(即在重定向响应头中加上Set-Cookie字段),然后浏览器通过Cookie里面的键值对来保存sessionId的值(sessionId=……),然后sessionId的值就被保存到浏览器本地中了。

getSession方法的参数设置成true则表示在服务器哈希表中找不到session信息时这个方法会创建一个新的session信息,设置成false则表示在服务器哈希表中找不到session信息时或没有sessionId时这个方法不会创建一个新的session信息而是返回null。

2.3步骤三

重定向响应会让浏览器触发一个GET请求,服务器会针对这个GET请求返回响应,即服务器通过另一个Servlet把用户数据返回给前端。然后前端再将数据显示到页面上。比如:凌亮用户登录成功后,就会显示“欢迎你,凌亮”。这相当于实现了登录成功后的页面跳转。
服务器的另一个Servlet代码如下:

@WebServlet("/index")
public class IndexServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession(false);if(session == null) {resp.setContentType("text/html; charset=utf8");resp.getWriter().write("你当前尚未登录");return;}String username = (String) session.getAttribute("username");long loginTime = (long) session.getAttribute("loginTime");resp.setContentType("text/html; charset=utf8");String respBody = "欢迎你" + username +"! 你的上次登录时间为:" + loginTime;resp.getWriter().write(respBody);}
}

HttpSession session = req.getSession(false);这行代码会根据GET请求cookie中的sessionId查询服务器中的哈希表,getSession方法的参数设置成false。前面登录时getSession方法的参数设置成true是因为我们希望当服务器哈希表中没有session信息时我们能创建出一个新的session信息,而这里是登录完了之后然后访问主页,这个时候我们是不希望创建出新的session信息的,我们需要用到的是已有的旧的session信息,这体现了一个session信息可以在多个Servlet之间共享。

前端发送登录的请求后后端查询服务器哈希表时用的sessionId和前端发送跳转页面的GET请求后后端查询服务器哈希表时用的sessionId是同一个sessionId(因为我们用的是同一个浏览器来访问登录页面和主页,所以这两次用的sessionId都来自cookie里的同一个键值对,即两次用的sessionId都一样),所以两次查询出来的是同一个session信息。

重定向响应会触发GET请求,这个GET请求的首行为GET http://127.0.0.1:8080/hello_servlet/index Http/1.1。

2.4总结通过Cookie和Session来实现登录功能

在浏览器中首次进行登录操作的时候,服务器会进行身份验证,验证通过后服务器会创建具有身份标识的会话信息(即session信息和sessionId)并将其保存到服务器哈希表中,然后通过响应将sessionId返回给客户端。客户端也会用Cookie中的键值对来保存身份标识sessionId(sessionId=……)。后续浏览器访问这个网站的其它页面(即非登录页面)时,请求中Cookie中的键值对都会带有sessionId(sessionId=……),这时服务器就不需要让用户重新登录也能识别出用户的身份信息了(即自动登录)。自动登录相当于用户进入网站时是已登录状态,这个已登录状态通常是有过期时间的,可以给Cookie设置过期时间,一定时间之后浏览器会自动把Cookie删除掉;也可以给Session信息设置过期时间,一定时间之后服务器会自动删除session信息(通常给Session信息设置过期时间更靠谱一些,因为服务器掌握在程序员手里)。

2.5运行截图

在这里插入图片描述

在这里插入图片描述

相关文章:

通过Cookie和Session来实现网站中登录账号的功能

文章目录 一、Cookie和Session二、基于Cookie和Session实现登录账号的功能2.1步骤一2.2步骤二2.3步骤三2.4总结通过Cookie和Session来实现登录功能2.5运行截图 一、Cookie和Session cookie是http请求header中的一个属性&#xff0c;是浏览器持久化存储数据的一种机制&#xff…...

QWidget 实现九宫格图案解锁

前言 最近需要实现一个九宫格图案解锁功能,查看网上的方案,基于QWidget的方案全网搜来搜去就一篇 Qt编写自定义控件:图案密码锁, 都是炒来炒去的同一篇,代码还比较复杂,运行后在PC端还是可以的,但是运行在arm机器上,就卡顿,或者容易断开手势连接线,各种不友好,于是自…...

设计模式-适配器模式(Adapter)

设计模式-适配器模式&#xff08;Adapter&#xff09; 一、适配器模式概述1.1 什么是适配器模式1.2 简单实现适配器模式1.3 使用适配器模式注意事项 二、适配器模式的用途三、实现适配器模式的方式3.1 继承适配器模式&#xff08;Inheritance Adapter&#xff09;3.2 组合适配器…...

react:创建项目

一&#xff1a; 使用create-react-app // 默认创建reactjs的webpack打包项目 npm i create-react-app -g create-react-app 项目名// 创建ts项目打包项目 sudo npx create-react-app my-app --template typescript 二&#xff1a; 使用vite npm create vitelatest // 创建react…...

RabbitMQ集群

RabbitMQ概述 1.RabbiMQ简介 RabbiMQ是⽤Erang开发的&#xff0c;集群⾮常⽅便&#xff0c;因为Erlang天⽣就是⼀⻔分布式语⾔&#xff0c;但其本身并不⽀持负载均衡。支持高并发&#xff0c;支持可扩展。支持AJAX&#xff0c;持久化&#xff0c;用于在分布式系统中存储转发消…...

Qt QtCreator调试Qt源码配置

目录 前言1、编译debug版Qt2、QtCreator配置3、调试测试4、总结 前言 本篇主要介绍了在麒麟V10系统下&#xff0c;如何编译debug版qt&#xff0c;并通过配置QtCreator实现调试Qt源码的目的。通过调试源码&#xff0c;我们可以对Qt框架的运行机制进一步深入了解&#xff0c;同时…...

JavaScript如何实现钟表效果,时分秒针指向当前时间,并显示当前年月日,及2024春节倒计时,源码奉上

本篇有运用jQuery&#xff0c;记得引入jQuery库&#xff0c;否则不会执行的喔~ <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <meta name"chenc" content"Runoob"> <met…...

重生奇迹MU套装大全中的极品属性

在重生奇迹MU之中&#xff0c;你不能如其他游戏一般只看攻击与防御&#xff0c;你更要看属性&#xff0c;这才是重生奇迹中的王道&#xff01;属性好&#xff0c;才是极品&#xff0c;属性不佳&#xff0c;即便攻击、防御再出色&#xff0c;也只能沦落成为一件替用品&#xff0…...

用Python解决猴子分桃问题

1 问题 海滩上有一堆桃子&#xff0c;五只猴子来分。第一只猴子把这堆桃子平均分为五份&#xff0c;多了一个&#xff0c;这只猴子把多的一个扔入海中&#xff0c;拿走了一份。第二只猴子把剩下的桃子又平均分成五份&#xff0c;又多了一个&#xff0c;它同样把多的一个扔入海中…...

YOLOv8-Seg改进:分割注意力系列篇 | 新型的多尺度卷积注意力(MSCA)模块

🚀🚀🚀本文改进: 新型的多尺度卷积注意力(MSCA)模块,实现创新,MSCA包含三个部分:深度卷积聚合局部信息,多分支深度条卷积捕获多尺度上下文,以及11卷积建模不同通道之间的关系。 🚀🚀🚀MSCA多尺度特性在小目标分割检测领域表现优异 🚀🚀🚀YOLOv8-seg…...

基于springboot实现致远汽车租赁平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现致远汽车租赁平台管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统…...

真的设计师做图只需要一个炫云客户端就够了

真的设计师做图只需要一个炫云客户端就够了&#xff0c;为什么这么说呢&#xff1f;因为炫云的这个客户端功能真的太全了&#xff0c;设计师想要的功能在炫云客户端上都有&#xff0c;而且还很多功能是免费的&#xff0c;非常的实用&#xff0c;具体有哪些功能我们一起来看看吧…...

简述 HTTP 请求的过程是什么?

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;请求的过程可以简单地描述为客户端与服务器之间的通信交互。下面是一般的 HTTP 请求过程&#xff1a; 解析 URL&#xff1a;客户端解析目标 URL&#xff0c;提取出服务器的主机名&#xff08;域名&#xff09;和端口号…...

免root修改手机imei的技术原理是什么?如何实现的?hook吗

在过去&#xff0c;修改手机IMEI&#xff08;International Mobile Equipment Identity&#xff09;通常需要Root权限&#xff0c;这给用户带来了一些不便&#xff0c;也存在一定的安全风险。然而&#xff0c;近年来&#xff0c;一些技术爱好者提出了一种免Root修改手机IMEI的方…...

【Redis】整合使用,进行注解式开发及应用场景和击穿、穿透、雪崩的讲解

目录 一、整合 1. 为什么 2. 整合应用 ( 1 ) pom配置 ( 2 ) 所需配置 3. 注解式开发及应用场景 1. Cacheable 2. CachePut 3. CacheEvict 4. 击穿、穿透、雪崩 一、整合 1. 为什么 Redis可以与SSM项目整合&#xff0c;主要是为了提高项目的性能和效率。以下是整合Re…...

数据分析-numpy

numpy numpy numpy简介优点下载ndarray的属性输出数据类型routines 函数ndarray对象的读写操作ndarray的级联和切分级联切分 ndarray的基本运算广播机制&#xff08;Broadcast&#xff09;ndarry的聚合操作数组元素的操作numpy 数学函数numpy 查找和排序 写在最后面 简介 nump…...

【Java】云HIS云端数字医院信息平台源码

一、云HIS系统特色 • 使用简易化 即开即用&#xff0c;快速复制&#xff0c;按需开通功能模块&#xff0c;多机构共享机房、软件、服务器、存储设备等资源&#xff0c;资源利用最大化。 • 连锁集团化 可支持连锁集团化管理&#xff0c;1N模式&#xff0c;支撑运营&#x…...

Jupyter Notebook 内核似乎挂掉了,它很快将自动重启

报错原因&#xff1a; OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade perfo…...

Flink -- 事件时间 Watermark

1、事件时间&#xff1a; 指的是数据产生的时间或是说是数据发生的时间。 在Flink中有三种时间分别是&#xff1a; Event Time&#xff1a;事件时间&#xff0c;数据产生的时间&#xff0c;可以反应数据真实发生的时间 Infestion Time&#xff1a;事件接收时间 Processing Tim…...

Django框架简介

文章目录 Django框架介绍MVC与MVT模型MVCMTV 版本问题运行django注意事项 Django的下载与基本命令下载Django方式一&#xff1a;在命令界面使用pip安装方式二&#xff1a;使用pycharm安装 Django的基础命令命令行操作pycharm操作 Django项目命令行操作与Pycharm操作的区别应用D…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

Vue 3 + WebSocket 实战:公司通知实时推送功能详解

&#x1f4e2; Vue 3 WebSocket 实战&#xff1a;公司通知实时推送功能详解 &#x1f4cc; 收藏 点赞 关注&#xff0c;项目中要用到推送功能时就不怕找不到了&#xff01; 实时通知是企业系统中常见的功能&#xff0c;比如&#xff1a;管理员发布通知后&#xff0c;所有用户…...