Springboot_实战

项目开发

lombok使用

自动为实体类提供get、set、toString方法

引入依赖

实体类上添加注解

统一响应结果

注意要写get、set方法;下面是错误的,因此要加上@Data注解

一个注册的接口的示例

Controller层

Service层

Mapper层

参数校验


但是同样存在一个问题,就是当参数不合法的时候,会报异常,因此前端接受的就不是我们定义的统一返回格式;

所以要使用全局异常处理器

@RestControllerAdice代表返回的是Json字符串

其中还要注意密码存在数据库中使用MD5加密

登录

登录认证

为什么要有登录认证?用户没有登录,用户不能访问其他功能的接口

令牌中应该具有的功能:

jwt

分为头部、载荷和签名三个部分;

头部通常包含两部分信息:

typ: 表示令牌的类型,通常为"JWT"。

alg: 表示所使用的签名算法,如HS256(HMAC SHA256)或RS256(RSA SHA256)。

有效载荷部分包含声明(Claims),声明可以分为三种类型:

注册声明(Registered Claims): 预定义的声明,比如iss(发行者)、exp(过期时间)、sub(主题)等。

公共声明(Public Claims): 可以自定义的声明,建议使用URI作为命名空间以避免冲突。

私有声明(Private Claims): 两个方之间自定义的声明,不会在JWT标准中定义。

为了生成签名部分,需要将编码后的头部和有效载荷以及一个密钥结合并使用指定的签名算法进行签名(所以能够知道数据是否改变了)

具体例子:

前端将获得的token放到请求头中来调用接口,后端获得请求头中token的方式:

使用拦截器来每次都检查调用的时候请求头中是否保存token

实现拦截器处理接口,并重写预处理方法;

实现WebMVC配置接口,将之前定义的拦截器处理对象注册到配置类中,并重写addInterceptors方法。

拦截器文件单独放到拦截器包下面。

定义配置类

Postman 为每个接口添加token的脚本:

用户敏感信息

添加@JsonIgnore,不返回密码这个字段。

下划线转为驼峰命名字段

ThreadLocal

由于在拦截器中已经进行过token解析的步骤,在接口中还进行token解析,这样很不优雅

原理

ThraedLocal原理:为线程提供局部变量,使得不同线程互不影响;例如有两个线程(蓝色和绿色线程)各自存入的数据只能自己访问得到。

在Tomcat中为不同的用户创建不同的进程,并没有说Tomcat是怎么知道不同的用户的。

如何使用

注意工具类ThreadLocal为静态final的;注意使用ThreadLocal如果不清除那么就会内存爆了。

java 复制代码
package com.itheima.utils;

import java.util.HashMap;
import java.util.Map;

/**
 * ThreadLocal 工具类
 */
@SuppressWarnings("all")
public class ThreadLocalUtil {
    //提供ThreadLocal对象,
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    //根据键获取值
    public static <T> T get(){
        return (T) THREAD_LOCAL.get();
    }
	
    //存储键值对
    public static void set(Object value){
        THREAD_LOCAL.set(value);
    }


    //清除ThreadLocal 防止内存泄漏
    public static void remove(){
        THREAD_LOCAL.remove();
    }
}

在拦截器中存放用户信息。

在Controller中获得之前存放的数据。

注意ThreadLocal的remove

在请求开始的时候进行set,在请求结束的时候释放;因此在拦截器 中重写afterCompletion 方法,释放内存;

@RequestBody

将Json字符串转化为对象

之前学的是如何验证参数,那么如何验证实体类中的参数?

在实体类中添加相关注解,还有通配符注解;

在Controller的参数前添加@Validated注解

Mapper函数中参数为对象,sql中想要获得属性值那么直接使用属性名就行了

分组校验

更新的时候校验参数不能为Null,但是添加的时候ID可以为Null;这就使用到了分组校验

在成员类中定义两个接口代表不同的分组;然后成员变量上面定义适用哪个组;Controller中的Validated中定义应该使用哪个组。

如果多个组A、B中存在相同校验规则的字段;那么可以不写校验规则,并让A和B都继承Default;例如A extends Defalt,那么被分为A类的字符段加上没有定义分组的字符段同属于A类组。

相关推荐
952363 小时前
MyBatis
后端·spring·mybatis
FQNmxDG4S5 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全6 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje6 小时前
Java语法进阶
java·开发语言·jvm
uzong6 小时前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
HackTorjan6 小时前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
rKWP8gKv76 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫6 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287926 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本6 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka