课次28:JWT工具类 & 登录接口
一、教学目标
集成JJWT,编写JwtUtil生成/解析token。
实现登录接口/user/login,验证用户名密码,返回token。
二、核心知识点(简要)
JWT:JSON Web Token,无状态认证。
JJWT:Java实现JWT的库。
@Value:注入配置文件中的值。
三、操作步骤

  1. 打开pom.xml文件,添加JJWT依赖,添加的内容和位置如下:

    io.jsonwebtoken
    jjwt
    0.9.1


    javax.xml.bind
    jaxb-api
    2.3.1

添加完之后,点右上角的刷新。

  1. 打开application.yml文件,添加JWT配置参数
    内容和位置如下:

jwt:
secret: weitoutiao_secret_key_2025
expire: 604800000 # 7天毫秒数

  1. 创建JwtUtil
    右键com.weitoutiao文件夹,新建java类:util.JwtUtil

image-20260616105942235
内容如下:

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;

public String generateToken(Integer userId, String username) {
Date now = new Date();
Date expiration = new Date(now.getTime() + expire);
return Jwts.builder()
.setSubject(String.valueOf(userId))
.claim("username", username)
.setIssuedAt(now)
.setExpiration(expiration)
.signWith(SignatureAlgorithm.HS256, secret)
.compact();
}

public Claims parseToken(String token) {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
}

public Integer getUserIdFromToken(String token) {
return Integer.parseInt(parseToken(token).getSubject());
}

public boolean validateToken(String token) {
try {
parseToken(token);
return true;
} catch (Exception e) {
return false;
}
}
}
4. 创建登录DTO
右键com.weitoutiao文件夹,新建java类:dto.UserLoginDTO

image-20260616110853453
类中内容如下:

package com.weitoutiao.dto;

import lombok.Data;

@Data
public class UserLoginDTO {
private String username;
private String password;
}
5. 创建UserService
右键service文件夹,新建java类:UserService

image-20260616111558525
UserService类中的内容如下:

package com.weitoutiao.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.weitoutiao.entity.User;

public interface UserService extends IService {
String login(String username, String password);
}
在service文件下,右键impl文件夹,新建java类:UserServiceImpl

image-20260616112114848
UserServiceImpl类中的内容如下:

package com.weitoutiao.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.weitoutiao.entity.User;
import com.weitoutiao.mapper.UserMapper;
import com.weitoutiao.service.UserService;
import com.weitoutiao.util.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

@Autowired
private JwtUtil jwtUtil;

@Override
public String login(String username, String password) {
// 1. 创建一个条件构造器(用于构建查询条件)
LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();

// 2. 添加查询条件:username = 传入的用户名 AND password = 传入的密码
wrapper.eq(User::getUsername, username)
.eq(User::getPassword, password);

// 3. 执行查询,返回唯一用户(若不存在则返回 null)
User user = this.getOne(wrapper);

// 4. 如果用户不存在,登录失败,返回 null
if (user == null) return null;

// 5. 生成 JWT Token,携带用户 id 和 username
return jwtUtil.generateToken(user.getId(), user.getUsername());
}
}

  1. 创建UserController
    右键controller文件夹,新建java类:UserController

image-20260616134549617
UserController类中的代码如下:

package com.weitoutiao.controller;

import com.weitoutiao.common.Result;
import com.weitoutiao.dto.UserLoginDTO;
import com.weitoutiao.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;

@PostMapping("/login")
public Result login(@RequestBody UserLoginDTO dto) {
String token = userService.login(dto.getUsername(), dto.getPassword());
if (token != null) {
return Result.success(token);
} else {
return Result.error("用户名或密码错误");
}
}
}
工程目录结构如下:

image-20260616135033159
7.用Postman测试
先运行后端,找到启动类,点运行

打开Postman,新建一个请求,login,保存

image-20260616135308316 image-20260616135406673
打开login,请求方式改为post,地址填:http://localhost:8080/user/login

更改请求体,选Body,选raw,格式选JSON

请求体内容:

{
"username": "testuser",
"password": "123456"
}

点击Send

返回的内容如下:

课次28:JWT工具类 & 登录接口
一、教学目标
二、核心知识点(简要)
三、操作步骤
1. 打开pom.xml文件,添加JJWT依赖,添加的内容和位置如下:
2. 打开application.yml文件,添加JWT配置参数
3. 创建JwtUtil
4. 创建登录DTO
5. 创建UserService
6. 创建UserController
7.用Postman测试

EOF