JWT工具类 & 登录接口

JWT工具类 & 登录接口

一、核心知识点

  • 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>

3203083-20260616222319617-98661852

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

2. 打开application.yml文件,添加JWT配置参数

内容和位置如下:

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

3203083-20260616223452188-209784194 (1)

3. 创建JwtUtil

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

3203083-20260616223452188-209784194 (1)

  • 内容如下:

    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

3203083-20260617144838035-874125886

  • 类中内容如下:

    package com.weitoutiao.dto;
    
    import lombok.Data;
    
    @Data
    public class UserLoginDTO {
        private String username;
        private String password;
    }
    

5. 创建UserService

  • 右键service文件夹,新建java类:UserService

3203083-20260616223546121-922653551

  • 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

3203083-20260616223556187-1199116954

  • 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());
        }
    }
    

6. 创建UserController

  • 右键controller文件夹,新建java类:UserController

3203083-20260616223556187-1199116954

  • 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("用户名或密码错误");
            }
        }
    }
    
  • 工程目录结构如下:

3203083-20260616223635936-2011099751

7.用Postman测试

  • 先运行后端,找到启动类,点运行

3203083-20260616223652167-1776159790

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

3203083-20260616223707664-1013832866
3203083-20260616223714779-21116235

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

3203083-20260616223722446-484635664

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

    请求体内容:

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

3203083-20260616223739725-1221211708

  • 点击Send

    返回的内容如下:

3203083-20260616223749305-197726628

posted @ 2026-06-26 21:43  沈瑜九  阅读(9)  评论(0)    收藏  举报