简介
概述:SpringBoot是Spring提供的一个子项目,用于快速构建Spring应用程序
SpringBoot特性:
>起步依赖:本质上就是一个Maven坐标,整合了完成一个功能需要的所有坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
>自动配置:遵循约定大约配置的原则,在boot程序启动后,一些bean对象会自动注入到ioc容器,不需要手动声明,简化开发
>其他特性:1.内嵌的Tomcat、Jetty(无需部署WAR文件)
2.外部化配置.
3.不需要XML配置(properties/yml)
三层架构
controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
service:业务逻辑层,处理具体的业务逻辑。
dao: 数据访问层(Data Access Object)(持久层 如mybatis),负责数据访问操作,包括数据的增、删、改、查。
执行流程:
前端发起请求后会到达Controller层,Controller层接收请求后调用Service层进行逻辑处理,而逻辑处理的前提是得先拿到数据,所以此时Service层会调用Dao层,Dao层再去操作文件中的数据,当数据拿到之后再把数据返回Service层,Service层再进行逻辑处理,处理后的结果再返回给Controller层,Controller层再响应数据,返回给前端
接口文档
通俗的讲,接口文档能告诉开发者接口能返回的数据,以及为了获取这些数据,开发者
需要输入什么样的数据,请求哪个接口(即规范)
为什么使用接口文档:
1、项目开发过程中前后端工程师有一个统一的文件进行沟通交流开发
2、项目维护中或者项目人员更迭,方便后期人员查看、维护
3、测试人员验证检查接口是否正确
JWT令牌
什么是JWT?
JSON Web Token(JWT)是一个开放的行业标准,它定义了一种简洁的、自包含的协议格式,用于在通信双方传递json对象,传递的信息经过数字签名可以被验证和信任。JWT可以使用HMAC算法或使用RSA的公钥/私钥对来签名,防止被篡改。
JWT令牌的优点: 1、jwt基于json,非常方便解析。 2、可以在令牌中自定义丰富的内容,易扩展。 3、通过非对称加密算法及数字签名技术,JWT防止篡改,安全性高。
JWT令牌结构:
JWT令牌由Header、Payload、Signature三部分组成,每部分中间使用点(.)分隔,比如:xxxxx.yyyyy.zzzzz
登录认证 拦截器
对于管理系统或其他需要用户登录的系统,登录验证都是必不可少的环节,在SpringBoot开发的项目中,通过实现拦截器来实现用户登录拦截并验证。
LoginInterceptor
package com.rzl.interceptors;
import com.rzl.utils.JwtUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import java.util.Map;
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//令牌验证
String token = request.getHeader("Authorization");
//解析token
try {
Map<String,Object> claims = JwtUtil.parseToken(token);
//放行
return true;
} catch (Exception e) {
// http响应状态码为401
response.setStatus(401);
//不放行
return false;
}
}
}
参数校验
注解
NotNull :值不能为null
NotEmpty :值不能为null,并且内容不为空
Email : 满足邮箱格式
User实体类
package com.rzl.pojo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@NotNull
private Integer id;//主键ID
private String username;//用户名
@JsonIgnore //让springmvc把当前对象转换为json字符串时,忽略password,最终的json字符串中就没有password这个属性
private String password;//密码
@NotEmpty
@Pattern(regexp = "^\\S{1,10}$")
private String nickname;//昵称
@NotEmpty
@Email
private String email;//邮箱
private String userPic;//用户头像地址
private LocalDateTime createTime;//创建时间
private LocalDateTime updateTime;//更新时间
}
UserController
@PutMapping("/update")
public Result update(@RequestBody @Validated User user) {
userService.update(user);
return Result.success();
}
令牌主动失效机制
1.登录成功后,给浏览器响应令牌的同时,把该令牌存储到redis中
2.LoginInterceptor拦截器中,需要验证浏览器携带的令牌,并同时需要获取到redis中存储的与之相同的令牌
3.当用户修改密码成功后,删除redis中存储的旧令牌
集成Redis
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency
application.yml
spring:
application:
name: big-event
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/big_event
username: root
password: 123456
data:
redis:
host: localhost
port: 6379