SpringBoot学习笔记3.27

news2025/3/31 21:35:36

目录

实战篇第二课

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层:

 

 至此,我们的用户接口全部书写完毕!

 

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

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

相关文章

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…

如何破解软件自动化测试框架的维护难题

破解软件自动化测试框架的维护难题应从优化测试用例设计、加强脚本的模块化与复用性、提高自动化测试工具的选择与使用效率等方面入手。其中&#xff0c;加强脚本的模块化与复用性尤为关键&#xff0c;通过提高脚本的模块化程度&#xff0c;可以显著降低后续维护成本&#xff0…

外星人入侵(python设计小游戏)

这个游戏简而言之就是操作一个飞机对前方的飞船进行射击&#xff0c;和一款很久之前的游戏很像&#xff0c;这里是超级低配版那个游戏&#xff0c;先来看看效果图&#xff1a; 由于设计的是全屏的&#xff0c;所以电脑不能截图。。。。 下面的就是你操控的飞船&#xff0c;上面…

iOS rootless无根越狱检测方案

不同于安卓的开源生态&#xff0c;iOS一直秉承着安全性更高的闭源生态&#xff0c;系统中的硬件、软件和服务会经过严格审核和测试&#xff0c;来保障安全性与稳定性。 据FairGurd观察&#xff0c;虽然iOS系统具备一定的安全性&#xff0c;但并非没有漏洞&#xff0c;如市面上…

LLM 优化技术(1)——Scaled-Dot-Product-Attention(SDPA)

在 Transformer 中抛弃了传统的 CNN 和 RNN&#xff0c;整个网络结构完全由Scaled Dot Product Attention 和Feed Forward Neural Network组成。一个基于 Transformer 的可训练的神经网络可以通过堆叠 Transformer 的形式进行搭建&#xff0c;Attention is All You Need论文中通…

基于音频驱动的CATIA动态曲面生成技术解析

一、技术背景与创新价值 在工业设计领域&#xff0c;参数化建模与动态仿真的结合一直是研究热点。本文提出的音频驱动建模技术突破了传统参数调整方式&#xff0c;实现了音乐节奏与三维曲面的实时动态交互。该技术可广泛应用于以下场景&#xff1a; ​艺术化产品设计&#xf…

5-管理员-维护权限

在“后台”-“人员管理”-“权限”下&#xff0c;通过不同的操作按钮&#xff0c;按照权限分组对权限进行设置。操作部分的按钮依次为 视野维护&#xff1a;设置该分组可以查看、访问的视图。权限维护&#xff1a;设置分组成员可以操作的具体动作等所有在禅道中涉及的权限。成…

全新升级 | Built For You Spring ‘25 发布,Fin 智能客服实现新突破!

图像识别、语音交互、任务自动化&#xff0c;立即体验智能客服蜕变&#xff01; 上周&#xff0c;Intercom 举办了 Built For You Spring 25 发布会&#xff0c;正式揭晓了 AI Agent Fin 的一系列令人振奋的更新。Fin 正在以前所未有的速度革新客户支持模式——它已经成功解决了…

LeeCode 434. 字符串中的单词数

统计字符串中的单词个数&#xff0c;这里的单词指的是连续的不是空格的字符。 请注意&#xff0c;你可以假定字符串里不包括任何不可打印的字符。 示例: 输入: "Hello, my name is John" 输出: 5 解释: 这里的单词是指连续的不是空格的字符&#xff0c;所以 "…

【AI编程学习之Python】第一天:Python的介绍

Python介绍 简介 Python是一种解释型、面向对象的语言。由吉多范罗苏姆(Guido van Rossum)于1989年发明,1991年正式公布。官网:www.python.org Python单词是"大蟒蛇”的意思。但是龟叔不是喜欢蟒蛇才起这个名字,而是正在追剧:英国电视喜剧片《蒙提派森的飞行马戏团》(Mo…

西域平台商品详情接口设计与实现‌

接口描述&#xff1a; 该接口用于获取西域平台中指定商品的详细信息&#xff0c;包括商品名称、价格、库存、描述、图片等。 点击获取key和secret 接口地址&#xff1a; GET /api/product/detail 请求参数&#xff1a; 参数名 类型 是否必填 描述 productId st…

如何让 history 记录命令执行时间?Linux/macOS 终端时间戳设置指南

引言:你真的会用 history 吗? 有没有遇到过这样的情况:你想回顾某个重要命令的执行记录,却发现 history 只列出了命令序号和内容,根本没有时间戳?这在运维排查、故障分析、甚至审计时都会带来极大的不便。 想象一下,你在服务器上误删了某个文件,但不知道具体是几点执…

04-SpringBoot3入门-配置文件(多环境配置)

1、简介 在 SpringBoot 中&#xff0c;不同的环境&#xff08;如开发、测试、生产&#xff09;可以编写对应的配置文件&#xff0c;例如数据库连接信息、日志级别、缓存配置等。在不同的环境中使用对应的配置文件。 2、配置环境 # 开发环境 zbj:user:username: root # 测试环…

windows第十八章 菜单、工具栏、状态栏

文章目录 创建框架窗口菜单菜单的风格通过资源创建菜单菜单的各种使用通过代码创建菜单在鼠标位置右键弹出菜单 CMenu常用函数介绍工具栏方式一&#xff0c;从资源创建工具栏方式二&#xff0c;代码创建 状态栏状态栏基础创建状态栏 创建框架窗口 手动创建一个空项目&#xff…

EMC电源端传导干扰预测试

本实验需要在微波暗室里面进行&#xff0c;隔离外界干扰。 1.EMI接收机和人工电源网络的电源线都插在隔离变压器上面&#xff0c;隔离变压器的电源插在AC220上面 2.被测设备EUT的电源线接在人工电源网络上&#xff1a; 人工电源网络的信号输出端连接EMI接收机。 EMI接收机前面…

94二叉树中序遍历解题记录

怎么说呢&#xff0c;以为这道题不用记录了&#xff0c;菜得吓到了自己。起因是这个遍历的递归一般是写两个函数完成&#xff0c;如下&#xff1a; func inorder(root *TreeNode, res *[]int) {if root nil {return}inorder(root.Left, res)*res append(*res, root.Val) // …

java项目之基于ssm的亚盛汽车配件销售业绩管理系统(源码+文档)

项目简介 亚盛汽车配件销售业绩管理系统实现了以下功能&#xff1a; 亚盛汽车配件销售业绩管理系统根据调研&#xff0c;确定管理员管理客户&#xff0c;供应商&#xff0c;员工&#xff0c;管理配件和配件的进货以及出售信息。员工只能管理配件和配件的出售以及进货信息&…

Spring Initializr搭建spring boot项目

介绍 Spring Initializr 是一个用于快速生成 Spring Boot 项目结构的工具。它为开发者提供了一种便捷的方式&#xff0c;可以从预先定义的模板中创建一个新的 Spring Boot 应用程序&#xff0c;从而节省了从头开始设置项目的大量时间。 使用 Spring Initializr&#xff0c;你…

第十二章:补充介绍pip与配置及Python结构层次

一、pip介绍pip介绍与配置及Python结构层次 1. pip是什么 pip 是 Python 的一个包管理工具&#xff0c;它允许你安装和管理 Python 库和依赖项。简单来说&#xff0c;pip 就是一个工具&#xff0c;它可以帮助你轻松地安装、更新、卸载 Python 的各种库。 2. pip属于什么层次的…

kotlin,jetpack compose 最简导航(navigation)案例学习

// 添加导航组件依赖&#xff0c;用于支持Compose中的导航功能 implementation ("androidx.navigation:navigation-compose:2.8.9") // 定义包名 package com.example.mynavigation// 导入所需的Android和Compose库 import android.os.Bundle import androidx.activ…