SpringBoot总结

简介

概述:SpringBoot是Spring提供的一个子项目,用于快速构建Spring应用程序

SpringBoot特性:

>起步依赖:本质上就是一个Maven坐标,整合了完成一个功能需要的所有坐标

XML 复制代码
<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

java 复制代码
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实体类

java 复制代码
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

java 复制代码
@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

java 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency

application.yml

java 复制代码
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
相关推荐
全职计算机毕业设计3 分钟前
基于SpringBoot框架的在线教育系统设计与实现(三套文档参考)
java·spring boot·后端
No8g攻城狮11 分钟前
【异常解决】使用DateUtil.isSameDay()方法判断秒级时间戳是否属于同一天踩过的坑
java·jvm·spring boot·java-ee·springboot
IT_陈寒13 分钟前
Python性能优化:5个被低估但效果惊人的内置函数实战解析
前端·人工智能·后端
千码君201634 分钟前
Go语言:对其语法的一些见解
开发语言·后端·golang
yuuki2332331 小时前
【C语言】预处理详解
c语言·windows·后端
合作小小程序员小小店1 小时前
web网页开发,在线%考试,教资,题库%系统demo,基于vue,html,css,python,flask,随机分配,多角色,前后端分离,mysql数据库
前端·vue.js·后端·前端框架·flask
顾漂亮1 小时前
Redis深度探索
java·redis·后端·spring·缓存
努力也学不会java1 小时前
【Spring】Spring事务和事务传播机制
java·开发语言·人工智能·spring boot·后端·spring
小姐姐味道1 小时前
Claude Skills:被过度吹嘘的的概念翻新!
后端·github·claude