spring boot 7

一、引入依赖(pom.xml)

1. JWT 依赖

xml

复制代码
<!-- JWT 依赖,用于生成和验证令牌 -->
<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.4.0</version>
</dependency>

2. 单元测试依赖(用于调试 JWT)

xml

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

二、登录接口实现(含参数校验)

1. Controller 层代码

java

运行

复制代码
@PostMapping("/login")
public Result login(
    @Pattern(regexp = "^\\S{5,16}$", message = "用户名必须是5-16位非空字符") String username,
    @Pattern(regexp = "^\\S{5,16}$", message = "密码必须是5-16位非空字符") String password
){
    // 1. 根据用户名查询用户
    User user = userService.findByUsername(username);
    
    // 2. 判断用户是否存在 + 密码是否正确(需用 MD5 加密后比对)
    if (user == null || !user.getPassword().equals(MD5Util.md5(password))){
        return Result.error("用户名或密码错误");
    }
    
    // 3. 登录成功,生成 JWT 令牌并返回
    String token = JwtUtil.generateToken(user.getId(), user.getUsername());
    return Result.success(token);
}

2. 已有 Service & Mapper 层

  • UserService.findByUsername(username):复用注册时的查询方法,直接获取用户信息
  • UserMapper.select * from user where username = ?:复用注册时的查询 SQL

三、JWT 原理与工具类实现

1. JWT 核心概念

JWT(JSON Web Token)是一种用于身份认证的令牌,由三部分组成:

  1. Header(头部) :记录令牌类型、签名算法(如 HS256
  2. Payload(有效载荷):携带业务数据(如用户 ID、用户名)和过期时间
  3. Signature(签名) :防止令牌被篡改,由 Header + Payload + 密钥 加密生成

2. JWT 工具类(JwtUtil.java

java

运行

复制代码
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {
    // 签名密钥(生产环境请用更复杂的密钥)
    private static final String SECRET_KEY = "itheima";
    // 过期时间:3小时
    private static final long EXPIRE_TIME = 1000 * 60 * 60 * 3;

    // 生成 JWT 令牌
    public static String generateToken(Integer id, String username) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("id", id);
        claims.put("username", username);

        return JWT.create()
                .withClaim("user", claims)
                .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRE_TIME))
                .sign(Algorithm.HMAC256(SECRET_KEY));
    }

    // 解析验证 JWT 令牌
    public static Map<String, Object> parseToken(String token) {
        DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SECRET_KEY))
                .build()
                .verify(token);
        return decodedJWT.getClaim("user").asMap();
    }
}

3. JWT 测试方法(单元测试)

java

运行

复制代码
@Test
void testJwt() {
    // 1. 生成令牌
    String token = JwtUtil.generateToken(1, "张三");
    System.out.println("生成的令牌:" + token);

    // 2. 解析验证令牌
    Map<String, Object> user = JwtUtil.parseToken(token);
    System.out.println("解析结果:" + user);
}

四、JWT 关键注意事项

  1. 密钥必须配对 :生成和解析令牌时,必须使用同一个 SECRET_KEY,否则验证失败
  2. 令牌篡改 / 过期校验:解析时如果报错,说明令牌被篡改、过期或非法,需直接拒绝访问
  3. 令牌安全性
    • 不要在 Payload 中存储敏感信息(如密码),仅存必要的业务数据
    • 设置合理的过期时间,避免令牌永久有效
    • 密钥需妥善保管,不要硬编码在代码中,可通过配置文件注入

五、登录认证的完整流程

  1. 用户输入用户名 / 密码,发送 /login 请求
  2. 后端校验参数格式,查询用户信息并比对密码
  3. 验证通过后,生成包含用户信息的 JWT 令牌返回给前端
  4. 前端后续请求携带该令牌,后端解析验证通过后才允许访问资源
相关推荐
linmengmeng_131411 小时前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
高级程序源11 小时前
django大学生创新创业项目管理系统94923-计算机课程设计、毕业设计
javascript·vue.js·spring boot·后端·python·django·课程设计
暮雨哀尘13 小时前
JAVA基础练习(四):SpringBoot 实现简易登录功能
java·spring boot·eclipse·maven
VXbishe15 小时前
【课程设计】基于SpringBoot的乡村政务服务系统的设计与实现-计算机毕设77011
javascript·vue.js·spring boot·python·php·课程设计·政务
vx_BS8133017 小时前
【项目编号:project51381】Spring Boot 婚纱摄影管理系统:套餐预约、在线咨询、支付与客片展示的一站式业务实现
java·spring boot·eclipse·tomcat·mybatis
雪芽蓝域zzs17 小时前
第11节:分页查询(MyBatis 实现分页,后端最常用功能)
spring boot
计算机毕设定制辅导-无忧学长17 小时前
《基于SpringBoot的中学教师数字胜任力测评网站的设计与实现》
java·vue.js·spring boot·mysql·中学教师数字胜任力测评网站
小蒜学长17 小时前
基于Java的论坛数据可视化分析系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·数据可视化·论坛系统
黑马程序员毕设17 小时前
基于微信小程序的二手交易平台设计与实现报告
前端·人工智能·spring boot·后端·考研