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类组。

相关推荐
懒羊羊不懒@2 分钟前
Java基础语法—最小单位、及注释
java·c语言·开发语言·数据结构·学习·算法
ss2736 分钟前
手写Spring第4弹: Spring框架进化论:15年技术变迁:从XML配置到响应式编程的演进之路
xml·java·开发语言·后端·spring
DokiDoki之父17 分钟前
MyBatis—增删查改操作
java·spring boot·mybatis
兩尛34 分钟前
Spring面试
java·spring·面试
舒一笑38 分钟前
🚀 PandaCoder 2.0.0 - ES DSL Monitor & SQL Monitor 震撼发布!
后端·ai编程·intellij idea
Java中文社群41 分钟前
服务器被攻击!原因竟然是他?真没想到...
java·后端
Full Stack Developme1 小时前
java.nio 包详解
java·python·nio
零千叶1 小时前
【面试】Java JVM 调优面试手册
java·开发语言·jvm
代码充电宝1 小时前
LeetCode 算法题【简单】290. 单词规律
java·算法·leetcode·职场和发展·哈希表
li3714908901 小时前
nginx报400bad request 请求头过大异常处理
java·运维·nginx