旅游项目day03
1. 前端整合后端发短信接口
2. 注册功能
后端提供注册接口,接受前端传入的参数,创建新的用户对象,保存到数据库。
-
接口设计:

-
实现步骤:
- 手机号码唯一性校验(后端一定要再次校验手机号唯一性):基于手机号查询是否已经存在该手机号,如果存在则返回异常。
- 从redis中获取验证码,与前端传入的验证码进行一致性校验,如果不一致则抛出异常
- 删除redis中的验证码
- 创建用户对象,填入参数并补充其它默认值
- 对密码进行加密
- 保存用户对象到数据库
-
编码实现:
-
controller
-
service
手机号码唯一性校验:

注意:
密码加密:使用md5加盐值进行加密
Md5Utils.getMD5(password + phone);
phone即充当盐,这是一个简单的实例,实际业务中可以散列,或者按照一定的规律进行增加复杂度,即密码安全性。整体业务:

统一异常处理:


统一异常处理后的核心业务:

细节:
对于redis中的key,由于其可能具有复用性,故可将其抽取成常量。
-
3. 登录实现
HTTP无状:不会记录之前请求的信息,每次请求都是独立的,请求之间不会相互影响。
- Session登录
收到用户名密码,后端进行校验,后端校验通过后,将用户存入Session,再访问其他接口时,判断Session中是否有对象,如果有,说明已经登录,反之未登录。
加入Session后,HTTP协议还是无状态的吗?
Session的原理:每个浏览器地依靠此访问Tomcat服务器的时候,会创建一个Session对象,并且生成一个唯一的SessionID,将SessionID返回给浏览器,浏览器将其存入Cookie中,之后该浏览器的每次访问都会携带SessionID,因此,Tomcat可以根据SessionID来知道谁是谁。**Tomcat服务变成了有状态的服务。**缺点是无法做横向扩展。

- 基于Token+Redis的登录方式
前端传递用户名密码,后端校验通过以后,生成一盒token作为key,用户对象作为value存入Redis,并且将token返回给浏览器,浏览器将其存储在本地,之后每次发起请求时,将token携带在请求头中,基于token从Redis中获取,判断token是否有效。
与Session登录的区别:将原先存储在Session的数据,存储在Redis中了,实现了分布式Session的共享。
Session其实可以理解为一个抽象的概念,即浏览器与服务器的会话。
这个时候,Tomcat仍然是无状态的服务。

- 新的登录方案
既能实现Session访问的高效,又能不用考虑数据共享问题,保证服务/协议的无状态特性。
方案:前端传递用户名密码给后端,后端校验通过后,生成一个唯一的token,以及将用户基础信息返回给前端,前端保存下来,之后只要用户传了token,就认为用户有登录。问题:token可能被伪造,无法确认token的有效性。
只要能够实现后端生成的token,客户端用户收到后,无法改造,而且后端还有办法验证该token有效,且可以实现针对token实现过期机制,就可以采用这样的方案。 - 基于JWT登录
JWT(JSON Web Tokens)是一种开放标准(RFC 7519),用于在两方之间安全地传输信息作为JSON对象。
这种信息传输可以被验证和信任,因为它是数字签名的。JWTs常用于身份验证和信息交换,特别是在Web应用程序中。JWT的组成
一个JWT通常由三部分组成,分别是头部(Header)、有效载荷(Payload)和签名(Signature)。1. 头部(Header):- 包含了用于处理令牌的类型(typ,通常是JWT)和签名或加密算法(alg,如HMAC SHA256或RSA)。2. 有效载荷(Payload):- 包含所谓的“声明”(Claims),这些声明是关于实体(通常是用户)和其他数据的声明。- 有三种类型的声明:注册声明(如iss发行人、exp过期时间)、公共声明(通常自定义,如用户ID和用户名)和私有声明(双方之间协商的信息)。3. 签名(Signature):- 用于验证消息在传输过程中未被篡改,并且,对于使用秘密密钥签名的令牌,可以验证发送者的身份。- 签名是使用头部指定的算法以及服务器存储的秘密(对于HMAC算法)或私钥(对于RSA和ECDSA)来生成的。JWT的使用
在身份验证过程中,当用户成功登录后,服务器会创建一个JWT,并将其发送回用户。然后用户在随后的请求中将此令牌发送回服务器,以验证其身份并访问受保护的资源。JWT的优势
- 无状态和可扩展性:JWT不需要在服务器上存储会话信息,因为令牌本身包含了所有必要的信息。这对于构建可扩展的应用程序特别有用。
- 跨语言支持:由于基于JSON格式,JWT可以被任何支持JSON的语言使用。
- 安全性:数字签名确保了在传输过程中令牌未被篡改。注意事项
- JWT不应包含敏感数据,因为其有效载荷可以被解码(即使是有签名的,也只是防篡改,而不是加密)。
- 适当的安全措施应该用于处理JWT,特别是在使用公开/私有密钥对的情况下。JWT因其简洁性和功能性,在现代Web应用程序中被广泛使用,特别是在实现无状态的API和单点登录(SSO)等场景中。

-
编码:
controller:

service:
相关文章:
旅游项目day03
1. 前端整合后端发短信接口 2. 注册功能 后端提供注册接口,接受前端传入的参数,创建新的用户对象,保存到数据库。 接口设计: 实现步骤: 手机号码唯一性校验(后端一定要再次校验手机号唯一性)…...
单片机学习记录(一)
简答题 第1章 1.微处理器、微计算机、CPU、单片机、嵌入式处理器他们之间有何区别? 答:微处理器、CPU都是中央处理器的不同称谓,微处理器芯片本身不是计算机; 单片机、微计算机都是一个完整的计算机系统,单片机是集…...
MacBookPro怎么数据恢复? mac电脑数据恢复?
使用电脑的用户都知道,被删除的文件一般都会经过回收站,想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样,但是“回收站”在mac电脑显示为“废纸篓”。 如果电脑回收站,或者是废纸篓里面的数据被清空了&…...
Python多线程—threading模块
参考:《Python核心编程》 threading 模块的Thread 类是主要的执行对象,而且,使用Thread类可以有很多方法来创建线程,这里介绍以下两种方法: 创建 Thread 实例,传给它一个函数。派生 Thread 的子类…...
mysql limit
语法 SELECT * FROM TABLE_NAME LIMIT 起始位置,偏移量注: 起始位置从0开始 示例 查询的第1条数据到第100条数据 limit 0,100查询的第101条数据到第200条数据 limit 100,100注意不要用 limit 101,100示例2 limit 语句应放在order by语句后面执行 …...
解决国内Linux服务器无法使用Github的方法
解决思路:修改Host https://www.ipaddress.com/ 利用上面的网站查询github.com和raw.githubusercontent.com的DNS解析的IP地址 最后,修改服务器的/etc/hosts 添加如下两行: 140.82.112.3 github.com 185.199.108.133 raw.githubuserconte…...
动态规划基础(二)最长公共子序列 LCS
讲解求两个串中最长的公共的子序列长度或输出子序列等 poj1458 题目大意 给定两个字符串,要求输出两个字符串中最长公共子序列长度 思路 我们定义 a [ i ] [ j ] a[i][j] a[i][j]为,当字串 s t r 1 str1 str1到 i i i位置,字串 s t r 2 s…...
React配置src根目录@
文章目录 1.打开webpack配置文件2.配置webpack 1.打开webpack配置文件 yarn eject or npm run eject 如果报错了记得提前 git commit一下 2.配置webpack 找到 webpack.config.js 文件在 webpack.config.js 文件中找到 alias 配置在alias里添加: path.resolve(src) , 或者 : pa…...
SQL Povit函数使用及实例
PIVOT函数常用于数据的行转列,同时也可以用此函数实现类似于Excel中的数据透视表的效果。 PIVOT函数 PIVOT 函数的基本语法如下: -- PIVOT 语法 SELECT <非透视的列>,[第一个透视的列] AS <列名称>,[第二个透视的列] AS <列名称>,.…...
Lite AD的安装
1、Lite AD的安装及配置 Lite AD流程: (1)创建一个新的Windows 10,安装tools,再安装ITA组件(安装Lite AD会自动安装VAG/VLB) (2)创建一个新的Windows 10,安…...
限流算法之流量控制的平滑之道:滑动时间窗算法
文章目录 引言简介优点缺点样例样例图样例代码 应用场景结论 引言 在互联网应用中,流量控制是一个重要的组件,用于防止系统过载和保护核心资源。常见的限流算法包括固定窗口算法和滑动时间窗算法。本文将重点介绍滑动时间窗算法,并分析其优缺…...
C语言数据结构——顺序表
(图片由AI生成) 0.前言 在程序设计的世界里,数据结构是非常重要的基础概念。本文将专注于C语言中的一种基本数据结构——顺序表。我们将从数据结构的基本概念讲起,逐步深入到顺序表的内部结构、分类,最后通过一个实…...
网络安全:守护数字世界的盾牌
在当今数字化的时代,网络已经渗透到我们生活的方方面面。从社交媒体到在线银行,从在线购物到工作文件传输,网络几乎无处不在。然而,随着网络的普及,网络安全问题也日益凸显。那么,如何确保我们的数字资产安…...
vue3hooks的使用
hook是钩子的意思,看到“钩子”是不是就想到了钩子函数?事实上,hooks 还真是函数的一种写法。 vue3 借鉴 react hooks 开发出了 Composition API ,所以也就意味着 Composition API 也能进行自定义封装 hooks。 vue3 中的 hooks …...
elementUI+el-upload 上传、下载、删除文件以及文件展示列表自定义为表格展示
Upload 上传组件的使用 官方文档链接使用el-upload组件上传文件 具体参数说明,如何实现上传、下载、删除等功能获取文件列表进行file-list格式匹配代码 文件展示列表自定义为表格展示 使用的具体参数说明文件大小展示问题(KB/MB)文件下载代码…...
供应链安全项目in-toto开源框架详解
引言:in-toto 是一个开源框架,能够以密码学的方式验证构件生产路径上的每个组件和步骤。它可与主流的构建工具、部署工具进行集成。in-toto已经被CNCF技术监督委员会 (Technical Oversight Committee,TOC)接纳为CNCF孵化项目。 1. 背景 由于…...
自己是如何使用单元测试
前言 自己是如何使用单元测试 进行单元测试能够让我们在编写方法的具体实现代码后,能清晰地看到其是否能实现预期的功能,有助于我们及时修正自己方法中存在的bug,以免在后续使用到某方法时出现意想不到的错误。 一、引入单元测试所使用的依赖…...
第二百七十八回
文章目录 1. 概念介绍2. 使用方法2.1 DropdownMenu2.1 DropdownMenuEntry 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何禁止页面跟随手机自动旋转"相关的内容,本章回中将介绍DropdownMenu组件.闲话休提,让我们一起Talk Flutter吧。 1.…...
Java 内存模型深度解析
优质博文:IT-BLOG-CN 一、并发编程模型的两个关键问题 【1】并发中常见的两个问题:线程之间如何通信及线程之间如何同步。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:内存共享和消息传递&…...
python爬取图片(thumbURL和html文件标签分别爬取)
当查看源代码,发现网址在thumbURL之后时,用此代码: # 当查看源代码,发现网址在thumbURL之后时,用此代码:import requestsheaders {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
