SpringBoot学习笔记3.27
目录
实战篇第二课
1.注册参数的校验:
学习过程中遇到的问题:
1.什么是正则表达式
2.怎么自定义异常?
1. 创建全局异常处理类
2. 定义响应对象
3. 使用 @ExceptionHandler
4. 设置响应状态码
5. 返回统一响应
6. 测试全局异常处理
注意事项@RestControllerAdive
实战篇第三课
1.登录的主逻辑
编辑 2.登录认证jwt
JWT的组成:
JWT的使用:
在test中模拟JWT的生成和使用(只用理解不用记忆):
3.如何实现登录认证(拦截器)?
实战第四课 :获取用户的详细信息
但是只执行过程中遇到两个小问题:
TreadLocal提供线程局部变量
具体实现:
实战第五课:
更新用户基本信息:
具体实现:
对更新用户的基本信息进行参数校验
编辑 具体实现:
更新用户密码:
具体实现:
至此,我们的用户接口全部书写完毕!
实战篇第二课
1.注册参数的校验:
注意@Pattern(regexp="")里面写的是正则表达式。

如果参数不合规,则会返回异常,而这个异常的格式和result格式不同,所以我们需要自定义一个全局的异常:

总结:

学习过程中遇到的问题:
1.什么是正则表达式
匹配符:
d? d出现0/1次
a* a可以出现0/多次
a+ a出现一次以上
a{6} a出现6次
a{2,} a出现2次以上
a{2,6} a出现2-6次
匹配多个字符:
(ab)+ ab出现一次以上
或运算:
a (cat|dog) 匹配 a cat or a dog
a cat|dog 匹配 a cat or dog
字符类:
匹配由abc构成的数据【abc】+ abc出现一次以上 abc aabbcc
【a-zA-Z0-9】 ABCabc123
^ 排除 【^0-9】 匹配0-9之外的数据(包括换行符)
元字符
\d 数字字符 \d+ 匹配一个以上的数字
\D 非数字字符
\w 单词字符 单词 数字 下划线即英文字符
\W 非单词字符
\s 空白符 包含空格和换行符
\S 非空白字符
\b 单词的边界 单词的开头或结尾 单词与符号之前的边界
\B 非单词的边界 符号与符号 单词与单词的边界
. 任意字符不包含换行符
\. 表示. 通过\进行了转意
^ 匹配行首 $ 匹配行尾
*+{}贪婪匹配
<strong><b>https://www.wondershare. com</strong></b>
<.+> 会匹配整串 因为是贪婪匹配
<.+?> 只匹配两个标签代码,➕? 设置为懒惰匹配
举例:
假设我们想要匹配一个有效的电子邮件地址,可以使用以下正则表达式:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
这个表达式的含义是:
-
^:匹配字符串的开始。 -
[a-zA-Z0-9._%+-]+:匹配一个或多个字母、数字、点、下划线、百分号、加号或减号。 -
@:匹配@字符。 -
[a-zA-Z0-9.-]+:匹配一个或多个字母、数字、点或减号。 -
\.:匹配点字符(需要转义,因为在正则表达式中点有特殊含义)。 -
[a-zA-Z]{2,}:匹配两个或多个字母。 -
$:匹配字符串的结束。
2.怎么自定义异常?
在 Spring 框架中,你可以通过实现 ExceptionHandler 接口或者使用 @ControllerAdvice 注解注解来定义全局异常处理。通过这种方式,你可以捕获并处理整个应用程序中抛出的特定异常,然后返回统一的响应。
以下是如何使用 @ControllerAdvice 和 @ExceptionHandler 来定义全局异常处理的步骤:
1. 创建全局异常处理类
首先,创建一个类并使用 @ControllerAdvice 注解注解标注该类,表示该类用于全局异常处理。
java复制
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;@ControllerAdvice
public class GlobalExceptionHandler {// 处理特定异常@ExceptionHandler(YourCustomException.class)@ResponseStatus(HttpStatus.BAD_REQUEST) // 设置响应状态码public ModelAndView handleCustomException(YourCustomException ex, WebRequest request) {ModelAndView modelAndView = new ModelAndView("errorPage");modelAndView.addObject("message", ex.getMessage());modelAndView.addObject("url", ((ServletWebRequest) request).getRequest().getRequestURL());return modelAndView;}// 处理所有异常@ExceptionHandler(Exception.class)public @ResponseBody ErrorResponse handleException(Exception ex, WebRequest request) {ErrorResponse errorResponse = new ErrorResponse();errorResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());errorResponse.setMessage(ex.getMessage());errorResponse.setPath(((ServletWebRequest) request).getRequest().getRequestURI());return errorResponse;}
}
2. 定义响应对象
定义一个响应对象 ErrorResponse,用于封装错误信息。
java复制
public class ErrorResponse {private int status;private String message;private String path;// getters and setters
}
3. 使用 @ExceptionHandler
在 @ControllerAdvice 注解注解的类中,使用 @ExceptionHandler 注解注解标注方法,以处理特定类型的异常。你可以为不同的异常类型定义不同的处理方法。
4. 设置响应状态码
使用 @ResponseStatus 注解注解设置 HTTP 响应状态码。
5. 返回统一响应
在异常处理方法中,返回统一的响应格式,可以是视图名称(对于 ModelAndView)或响应体(对于 @ResponseBody)。
6. 测试全局异常处理
现在,当你的项目中抛出定义的异常时,Spring 会自动使用你定义的全局异常处理方法来处理这些异常,并返回统一的响应。
注意事项@RestControllerAdive
-
确保
@ControllerAdvice注解注解的类在 Spring 应用上下文中被扫描到,通常放在@ComponentScan指定的包路径下。 -
你可以根据需要定义多个异常处理方法,分别处理不同类型的异常。
-
全局异常处理可以大大简化异常处理代码,提高代码的可维护性和可读性。
-
@RestControllerAdvice是@ControllerAdvice的一个特化,专门用于 RESTful 控制器(使用@RestController注解的控制器)。 -
它通常用于处理 RESTful 服务中的异常,返回 JSON 或 XML 格式的响应体。
-
@RestControllerAdvice中的方法通常返回@ResponseBody注解的对象,这样对象会被自动序列化为 JSON 或 XML 格式。 -
它不适用于返回视图(View)或
ModelAndView对象,因为它主要用于 RESTful API。
实战篇第三课
1.登录的主逻辑
登录过程中查询用户名称和密码,在注册时已经时间,所以主要实现Controller层逻辑

Controller层的登录逻辑实现:
2.登录认证jwt

JWT的组成:
包含header、payload、signature三个部分,注意有效载荷里面不要放私密数据。
JWT的使用:
前端在完成登录后,后端会返回一个JWT,每当浏览器发送请求时,会携带JWT用于验证是否登录

JWT的生成(不用特别记忆,主要是理解JWT的构成):

JWT是如何解密和验证的?如果头载荷或者签名有一个出错,都会返回错误。
总结:
在test中模拟JWT的生成和使用(只用理解不用记忆):
.withClaim()方法用于添加负荷,.withExpiresAt()添加过期时间,.sign()指定加密算法和秘钥,这样我们就会create出一个JWT字符串。

.build()生成JWT解码器,解码器可以解析JWT,解析后的结果调用.getClaim()会获得负荷,注意负荷会是一个<String,Claim>的形式;
3.如何实现登录认证(拦截器)?
我们要创建一个拦截器,因为在登录后浏览器的每次请求都会携带JWT,在访问一些登录后才能查看的路径时,如果JWT有问题,那么就会返回401状态码并提示未登录;对于登录和注册界面没必要添加拦截。

拦截器实现:
1首先要创建一个拦截器。要实现HandlerInterceptor接口,重写里面的PreHandle方法

2然后我们要将这个拦截器配置到WebMvcConfigurer里面,即重写里面的addInterceptors方法,将拦截器注册到环境中去,注意login和register界面不用拦截。

3postman测试一下,携带正确的Autorization的请求头返回正确,不携带token的话会被拦截且返回401

实战第四课 :获取用户的详细信息

Controller层的实现方法,通过请求头获取JWT,解码JWT获得有效载荷里面的username,在通过username去查询用户信息:

但是只执行过程中遇到两个小问题:
第一个是我们返回的user里面,我们给前端返回的用户详细信息不能包含password,我们给它添加@JsonIgnore后,他可以在当user类转化成json时,不传输对应的属性;
第二个是由于user实体类中时间的命名是驼峰命名,而数据库中我们是下划线命名,如:create_time这样,那么我们在@Select后,两个时间属性就不会赋值给user类,解决这个只需要在配置文件中打开mybatis的驼峰命名和下划线命名的自动转换:
TreadLocal提供线程局部变量


具体实现:
1.在每次对请求拦截时,我们会获取token中的负载,在后面的Controller或者service中我们可能会再次用到这个负载,那么我们可以用一个线程安全的全局变量来存储这个负载,减少我们后面传递、计算的开销。
2.我们在Controller层就可以直接使用获取的这个负载。

3.请求完成之后我们要释放这个threadlocal

实战第五课:
更新用户基本信息:


具体实现:
1.Controller层里面写好update方法,注意@RequestBody:告诉 Spring,方法的 user 参数应该从请求体中获取数据,使Spring 会自动将 JSON 或 XML 数据转换为 Java 对象。

2.service层的实现类去调用Mapper层的方法:

3.Mapper层执行SQL语句:

对更新用户的基本信息进行参数校验

具体实现:

注意要在使用时添加@Validated注解里面的校验注解才会生效:

注意我们如果要修改用户头像,我们需要对参数进行校验,在参数钱添加@URL进行校验:
更新用户密码:

具体实现:
Controller层,注意逻辑,原密码不正确、新密码和确认密码不一致、有任意一个密码为空都会直接返回error:
Service层:
Mapper层:
至此,我们的用户接口全部书写完毕!
相关文章:
SpringBoot学习笔记3.27
目录 实战篇第二课 1.注册参数的校验: 学习过程中遇到的问题: 1.什么是正则表达式 2.怎么自定义异常? 1. 创建全局异常处理类 2. 定义响应对象 3. 使用 ExceptionHandler 4. 设置响应状态码 5. 返回统一响应 6. 测试全局异常处理 …...
亚马逊严查变体!正常变体突然被拆分?!
近期,亚马逊平台对变体合规性的审查力度再次升级,许多卖家因此遭遇了变体评论被拆分、账号受限甚至被封禁的困境。这一变化让不少卖家措手不及,原本正常的变体评论突然被拆分,子体的评价不再汇总显示,而是各自独立呈现…...
2025NCTF--Web
文章目录 Websqlmap-masterez_dashez_dash_revenge Web sqlmap-master 源码 from fastapi import FastAPI, Request from fastapi.responses import FileResponse, StreamingResponse import subprocessapp FastAPI()app.get("/") async def index():return File…...
如何破解软件自动化测试框架的维护难题
破解软件自动化测试框架的维护难题应从优化测试用例设计、加强脚本的模块化与复用性、提高自动化测试工具的选择与使用效率等方面入手。其中,加强脚本的模块化与复用性尤为关键,通过提高脚本的模块化程度,可以显著降低后续维护成本࿰…...
外星人入侵(python设计小游戏)
这个游戏简而言之就是操作一个飞机对前方的飞船进行射击,和一款很久之前的游戏很像,这里是超级低配版那个游戏,先来看看效果图: 由于设计的是全屏的,所以电脑不能截图。。。。 下面的就是你操控的飞船,上面…...
iOS rootless无根越狱检测方案
不同于安卓的开源生态,iOS一直秉承着安全性更高的闭源生态,系统中的硬件、软件和服务会经过严格审核和测试,来保障安全性与稳定性。 据FairGurd观察,虽然iOS系统具备一定的安全性,但并非没有漏洞,如市面上…...
单端信号差分信号
单端信号和差分信号是电路中常见的两种信号传输方式,它们在具体的应用场景和特点上有着明显的区别。下面就来详细说明一下单端信号和差分信号的区别。 首先,单端信号是指信号通过一个信号线传输,通常一个信号线携带一个信号。这种传输方式适…...
LLM 优化技术(1)——Scaled-Dot-Product-Attention(SDPA)
在 Transformer 中抛弃了传统的 CNN 和 RNN,整个网络结构完全由Scaled Dot Product Attention 和Feed Forward Neural Network组成。一个基于 Transformer 的可训练的神经网络可以通过堆叠 Transformer 的形式进行搭建,Attention is All You Need论文中通…...
AIGC-头条号长文项目创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各...
基于音频驱动的CATIA动态曲面生成技术解析
一、技术背景与创新价值 在工业设计领域,参数化建模与动态仿真的结合一直是研究热点。本文提出的音频驱动建模技术突破了传统参数调整方式,实现了音乐节奏与三维曲面的实时动态交互。该技术可广泛应用于以下场景: 艺术化产品设计…...
5-管理员-维护权限
在“后台”-“人员管理”-“权限”下,通过不同的操作按钮,按照权限分组对权限进行设置。操作部分的按钮依次为 视野维护:设置该分组可以查看、访问的视图。权限维护:设置分组成员可以操作的具体动作等所有在禅道中涉及的权限。成…...
全新升级 | Built For You Spring ‘25 发布,Fin 智能客服实现新突破!
图像识别、语音交互、任务自动化,立即体验智能客服蜕变! 上周,Intercom 举办了 Built For You Spring 25 发布会,正式揭晓了 AI Agent Fin 的一系列令人振奋的更新。Fin 正在以前所未有的速度革新客户支持模式——它已经成功解决了…...
turtle的九个使用
一 import turtle as t color [red,green,blue,orange,pink] for i in range(len(color)):t.penup()t.goto(-20070*i,0)t.pendown()t.pencolor(color[i])t.circle(50, steps 5) t.done()二 #在____________上补充代码 #不要修改其他代码import random as r import turtle a…...
营销库存系统设计方案
文章目录 一、营销库存系统设计方案1. 核心模块设计实时库存管理促销库存预占机制库存分层调度动态库存分配2. 技术架构示例二、技术难点与解决方案高并发下的数据一致性防超卖与恶意请求拦截多级库存同步延迟异常场景处理三、关键注意事项1.系统弹性…...
R002-云计算
1 概念 英文名:Cloud Computing 核心:云计算的核心概念就是以互联网为中心,在网站上提供快速且安全的云计算服务与数据存储,让每一个使用互联网的人都可以使用网络上的庞大计算资源与数据中心 2.分类 基础设施即服务(IaaS)它向…...
LeeCode 434. 字符串中的单词数
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。 请注意,你可以假定字符串里不包括任何不可打印的字符。 示例: 输入: "Hello, my name is John" 输出: 5 解释: 这里的单词是指连续的不是空格的字符,所以 "…...
DriveDreamer动力学模块和博弈论优化器
DriveDreamer的动力学模块与博弈论优化器是其实现复杂场景下高保真重建与多智能体协同优化的核心技术组件。 一、动力学模块(NTGM) 功能定位:作为新轨迹生成模块(Novel Trajectory Generation Module, NTGM)…...
【AI编程学习之Python】第一天:Python的介绍
Python介绍 简介 Python是一种解释型、面向对象的语言。由吉多范罗苏姆(Guido van Rossum)于1989年发明,1991年正式公布。官网:www.python.org Python单词是"大蟒蛇”的意思。但是龟叔不是喜欢蟒蛇才起这个名字,而是正在追剧:英国电视喜剧片《蒙提派森的飞行马戏团》(Mo…...
西域平台商品详情接口设计与实现
接口描述: 该接口用于获取西域平台中指定商品的详细信息,包括商品名称、价格、库存、描述、图片等。 点击获取key和secret 接口地址: GET /api/product/detail 请求参数: 参数名 类型 是否必填 描述 productId st…...
如何让 history 记录命令执行时间?Linux/macOS 终端时间戳设置指南
引言:你真的会用 history 吗? 有没有遇到过这样的情况:你想回顾某个重要命令的执行记录,却发现 history 只列出了命令序号和内容,根本没有时间戳?这在运维排查、故障分析、甚至审计时都会带来极大的不便。 想象一下,你在服务器上误删了某个文件,但不知道具体是几点执…...
云原生四重涅槃·破镜篇:混沌工程证道心,九阳真火锻金身
【乾坤惊变混沌劫起】 "轰——!" 龙渊山巅突然雷云翻滚,九重天外传来梵音轰鸣。监察使手中玄光镜剧烈震颤,镜中映出骇人景象:原本井然有序的Service Mesh星轨竟自行扭曲,数十万Envoy边车化身血色修罗&#…...
04-SpringBoot3入门-配置文件(多环境配置)
1、简介 在 SpringBoot 中,不同的环境(如开发、测试、生产)可以编写对应的配置文件,例如数据库连接信息、日志级别、缓存配置等。在不同的环境中使用对应的配置文件。 2、配置环境 # 开发环境 zbj:user:username: root # 测试环…...
CodeSouler v1.15.0 版本更新
经过深度研发与全面优化,CodeSouler迎来了又一次重要升级。本次更新不仅提升了插件的智能化水平,更将“自主开发”从愿景变为现实! 无论你是在构建插件、部署工具链,还是希望提升开发效率,v1.15.0版本都将为你带来更流…...
windows第十八章 菜单、工具栏、状态栏
文章目录 创建框架窗口菜单菜单的风格通过资源创建菜单菜单的各种使用通过代码创建菜单在鼠标位置右键弹出菜单 CMenu常用函数介绍工具栏方式一,从资源创建工具栏方式二,代码创建 状态栏状态栏基础创建状态栏 创建框架窗口 手动创建一个空项目ÿ…...
EMC电源端传导干扰预测试
本实验需要在微波暗室里面进行,隔离外界干扰。 1.EMI接收机和人工电源网络的电源线都插在隔离变压器上面,隔离变压器的电源插在AC220上面 2.被测设备EUT的电源线接在人工电源网络上: 人工电源网络的信号输出端连接EMI接收机。 EMI接收机前面…...
94二叉树中序遍历解题记录
怎么说呢,以为这道题不用记录了,菜得吓到了自己。起因是这个遍历的递归一般是写两个函数完成,如下: func inorder(root *TreeNode, res *[]int) {if root nil {return}inorder(root.Left, res)*res append(*res, root.Val) // …...
java项目之基于ssm的亚盛汽车配件销售业绩管理系统(源码+文档)
项目简介 亚盛汽车配件销售业绩管理系统实现了以下功能: 亚盛汽车配件销售业绩管理系统根据调研,确定管理员管理客户,供应商,员工,管理配件和配件的进货以及出售信息。员工只能管理配件和配件的出售以及进货信息&…...
ebay跨境电商账号安全防护:IP污染风险深度解析及应对方案
一、IP污染的技术定义与风控逻辑 在跨境电商运营中,IP污染特指因网络地址关联导致的账号风控问题。eBay平台通过多维数据监测体系(包括IP归属地、设备指纹、网络行为模式等)识别账号关联性。当系统检测到多个账号存在网络层特征重叠时&#x…...
云资源开发学习应用场景指南,场景 1 云上编程实践平台
云资源开发学习应用场景指南 云资源开发学习应用场景指南,场景 2:云桌面实验室 云资源开发学习应用场景指南,场景 3:云资源支持的项目实践 场景 1:云上编程实践平台 《如何在云平台上搭建你的第一个编程实践环境》…...
前端开发3D-基于three.js
基于 three.js 渲染任何画面,都要基于这 3 个要素来实现 1场景scene:放置物体的容器 2摄像机:类似人眼,可调整位置,角度等信息,展示不同画面 3渲染器:接收场景和摄像机对象,计算在浏…...
