06-18
微头条后端标准化开发笔记
一、今日学习总目标
统一后端接口返回格式、全局异常统一捕获、JWT登录鉴权工具封装、登录传输实体类开发,完成微头条项目后端基础规范搭建,规范前后端交互标准。
二、知识点1:通用API返回封装 Result类(代码练习1)
-
开发作用:统一项目所有接口返回JSON结构,固定 {code, message, data} 三段式格式,降低前端对接、解析数据的成本;
-
核心依赖注解:@Data(Lombok工具,自动生成get、set、toString等方法,简化实体类代码);
-
实体完整代码:
package com.weitoutiao.common;
import lombok.Data;
@Data
public class Result
// 响应状态码:200成功,500业务异常
private Integer code;
// 响应提示文本
private String message;
// 接口返回业务数据,泛型兼容所有数据类型
private T data;
// 私有构造方法,禁止外部直接new,统一调用静态方法创建对象
private Result(Integer code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
// 场景1:操作成功,携带业务数据返回
public static
return new Result<>(200, "success", data);
}
// 场景2:操作成功,无返回数据,仅提示文字
public static
return new Result<>(200, message, null);
}
// 场景3:业务异常、操作失败,返回错误提示
public static
return new Result<>(500, message, null);
}
}
4. 使用规范:项目所有Controller接口,返回值统一使用Result包装,禁止直接返回原始数据、字符串。
三、知识点2:全局异常处理器 GlobalExceptionHandler(代码练习2)
-
解决痛点:分散在各个接口单独捕获异常会产生大量重复代码,全局拦截统一处理所有运行时异常,统一封装为Result错误格式返回前端;
-
核心注解说明:
◦ @RestControllerAdvice:全局REST接口异常拦截器,仅拦截标注@RestController的控制器;
◦ @ExceptionHandler(RuntimeException.class):指定当前方法拦截运行时异常;
- 完整代码实现:
package com.weitoutiao.common;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
// 捕获所有运行时异常
@ExceptionHandler(RuntimeException.class)
public Result<?> handleRuntimeException(RuntimeException e) {
// 打印异常堆栈,方便后端定位报错位置
e.printStackTrace();
// 封装错误信息统一返回
return Result.error(e.getMessage());
}
}
4. 实操说明:接口代码无需手动try-catch,运行抛出异常会自动进入该类处理,简化业务代码。
四、知识点3:测试接口Controller 校验返回格式(代码练习3)
- 注解说明:
◦ @RestController:标识当前类为REST风格接口控制器,返回JSON数据;
◦ @GetMapping("/hello"):绑定GET请求访问路径;
- 测试接口完整代码:
package com.weitoutiao.controller;
import com.weitoutiao.common.Result;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public Result hello() {
// 调用Result静态成功方法返回提示
return Result.success("微头条后端启动成功!");
}
}
3. 接口验证工具Postman:输入地址发送GET请求,校验返回JSON是否符合统一格式标准,截图留存返回结果。
五、知识点4:JWT登录令牌工具前置依赖(代码练习4)
-
Maven引入JWT工具依赖,用于生成、解析登录Token,实现无状态登录鉴权:
io.jsonwebtoken
jjwt
0.9.1
javax.xml.bind
jaxb-api
2.3.1
六、知识点5:JwtUtil令牌工具类封装(代码练习5) -
工具类作用:登录成功生成加密Token、接口请求解析Token获取登录用户信息、校验Token是否过期/篡改;
-
配置读取:@Value注解读取yml配置文件中自定义的jwt密钥、令牌过期时长;
-
完整工具代码:
package com.weitoutiao.util;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class JwtUtil {
// 读取配置文件密钥
@Value("${jwt.secret}")
private String secret;
// 读取令牌过期时间
@Value("${jwt.expire}")
private Long expire;
// 生成登录Token
public String generateToken(Integer userId, String username) {
Date now = new Date();
// 计算过期时间
Date expiration = new Date(now.getTime() + expire);
return Jwts.builder()
.setSubject(userId.toString()) // 存入用户ID
.claim("username", username) // 存入用户名
.setExpiration(expiration) // 设置过期时间
.signWith(SignatureAlgorithm.HS256, secret) // HS256加密
.compact();
}
// 解析Token,获取载荷信息
public Claims parseToken(String token) {
return Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
}
// 从令牌中提取用户ID
public Integer getUserIdFromToken(String token) {
return Integer.parseInt(parseToken(token).getSubject());
}
// 校验Token是否有效(未过期、未篡改)
public boolean validateToken(String token) {
try {
parseToken(token);
return true;
} catch (Exception e) {
// 解析报错=令牌失效
return false;
}
}
}
4. 开发逻辑:用户登录成功调用generateToken返回令牌,前端存储在请求头,后续所有接口携带Token,后端通过工具类校验身份。
七、知识点6:登录接收DTO实体类 UserLoginDTO(代码练习6)
-
DTO作用:专门接收前端登录提交的账号、密码参数,分层解耦,不直接使用数据库实体接收请求参数;
-
完整代码:
package com.weitoutiao.dto;
import lombok.Data;
@Data
public class UserLoginDTO {
// 前端提交用户名
private String username;
// 前端提交密码
private String password;
}
3. 分层规范:dto包存放前端入参实体、entity包存放数据库映射实体、vo包存放返回前端数据实体,分层清晰便于维护。
八、今日开发总结
-
完成后端三层规范:统一返回格式、全局异常拦截、登录鉴权工具封装,搭建项目基础骨架;
-
全部代码可直接整合进微头条项目,无需重复修改格式;
-
后续开发计划:编写登录Controller,接收UserLoginDTO参数,校验数据库账号密码,成功后调用JwtUtil生成Token返回前端。
浙公网安备 33010602011771号