课次28:JWT工具类 & 登录接口
一、教学目标
集成JJWT,编写JwtUtil生成/解析token。
实现登录接口/user/login,验证用户名密码,返回token。
二、核心知识点(简要)
JWT:JSON Web Token,无状态认证。
JJWT:Java实现JWT的库。
@Value:注入配置文件中的值。
三、操作步骤
- 打开pom.xml文件,添加JJWT依赖,添加的内容和位置如下:
io.jsonwebtoken
jjwt
0.9.1
javax.xml.bind
jaxb-api
2.3.1
添加完之后,点右上角的刷新。
- 打开application.yml文件,添加JWT配置参数
内容和位置如下:
jwt:
secret: weitoutiao_secret_key_2025
expire: 604800000 # 7天毫秒数
- 创建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
// 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());
}
}
- 创建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
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
浙公网安备 33010602011771号