JWT工具类 & 登录接口

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

  1. 打开pom.xml文件,添加JJWT依赖,添加的内容和位置如下:
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

添加完之后,点右上角的刷新。
2. 打开application.yml文件,添加JWT配置参数
内容和位置如下:

jwt:
  secret: weitoutiao_secret_key_2025
  expire: 604800000   # 7天毫秒数
  1. 创建JwtUtil
    右键com.weitoutiao文件夹,新建java类:util.JwtUtil
    内容如下:
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;
        }
    }
}
  1. 创建登录DTO
    右键com.weitoutiao文件夹,新建java类:dto.UserLoginDTO
    类中内容如下:
package com.weitoutiao.dto;

import lombok.Data;

@Data
public class UserLoginDTO {
    private String username;
    private String password;
}
  1. 创建UserService
    右键service文件夹,新建java类:UserService
    UserService类中的内容如下:
package com.weitoutiao.service;

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

public interface UserService extends IService<User> {
    String login(String username, String password);
}

在service文件下,右键impl文件夹,新建java类:UserServiceImpl
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<User> 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
    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> login(@RequestBody UserLoginDTO dto) {
        String token = userService.login(dto.getUsername(), dto.getPassword());
        if (token != null) {
            return Result.success(token);
        } else {
            return Result.error("用户名或密码错误");
        }
    }
}

.用Postman测试
先运行后端,找到启动类,点运行
打开Postman,新建一个请求,login,保存
打开login,请求方式改为post,地址填:http://localhost:8080/user/login
更改请求体,选Body,选raw,格式选JSON
请求体内容:

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

点击Send

posted on 2026-06-24 10:42  爱我的果果吖  阅读(10)  评论(0)    收藏  举报