Jwts(jwt)生成token以及根据token获取用户信息

本文介绍了一个使用Java实现JWT生成Token的方法。通过示例代码详细解释了如何创建包含用户ID和用户名等信息的JWT Token,并提供了如何从Token中解析用户ID和用户名的方法。此外,还介绍了JWT Token的组成部分及其有效期设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    用Jwts生成token

package com.xxx.xxx

import io.jsonwebtoken.*;
import org.apache.commons.lang3.StringUtils;

import javax.crypto.spec.SecretKeySpec;
import java.util.Date;
import java.util.UUID;


/**
 * 生成token
 *
 * @Author Ldpy
 * @Date 2022/10/30 16:55
 * @Version 1.0
 **/
public class JwtUtil {

    //过期时间(半小时)
    private static long tokenExpiration = 30*60*1000;
    //签名秘钥
    private static String tokenSignKey = "wodexiaokeai";

    //根据参数生成token,三部分组成,用 . 隔开
    public static String createToken(Long userId, String userName) {
        String token = Jwts.builder()
                .setSubject(userName)
                .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)) // 公共部分结束
                .claim("jti", UUID.randomUUID().toString())
                .claim("userId", userId)
                .claim("userName", userName) // 私有部分,实际上真正需要封装的信息(id和name)
                .claim("iat", new Date())
                .claim("iss", "dt360.com")
                .claim("nbf", new Date())
                .signWith(SignatureAlgorithm.HS512, new SecretKeySpec(tokenSignKey.getBytes(), SignatureAlgorithm.HS512.getJcaName())) // 签名部分
                .compressWith(CompressionCodecs.DEFLATE)
                .compact();
        return token;
    }

    //根据token字符串得到用户id
    public static Long getUserId(String token) {
        if(StringUtils.isEmpty(token)) return null;

        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        Integer userId = (Integer)claims.get("userId");
        return userId.longValue();
    }

    //根据token字符串得到用户名称
    public static String getUserName(String token) {
        if(StringUtils.isEmpty(token)) return "";

        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        return (String)claims.get("userName");
    }

    // 测试
    public static void main(String[] args) {
        String token = JwtHelper.createToken(1L, "lucy");
        System.out.println(token);
        System.out.println(JwtHelper.getUserId(token));
        System.out.println(JwtHelper.getUserName(token));
    }
}

    另,这篇文章也不错:使用JWT生成token_尚硅谷铁粉的博客-优快云博客_jwt生成token

Spring Boot 集成 JWT (JSON Web Token) 可以为我们的应用提供一种轻量级的身份验证机制。JWT 的核心思想是通过加密的方式生成 token,并将其传递给客户端,在后续请求中,客户端携带该 token 进行身份认证。 以下是关于如何在 Spring Boot 中集成 JWT 并实现 token 和 refresh token 功能的基本步骤: ### 1. 添加依赖项 首先需要引入相关的库到 `pom.xml` 文件中(假设您使用的是 Maven 构建工具)。例如: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <scope>runtime</scope> <version>0.11.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <scope>runtime</scope> <version>0.11.5</version> </dependency> ``` ### 2. 创建 JWT 工具类 用于生成和解析 token 的工具类。示例代码如下: ```java import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; public class JwtUtil { private static final String SECRET_KEY = "yourSecretKey"; // 加密密钥 public String generateToken(String subject){ return Jwts.builder() .setSubject(subject) .setExpiration(new Date(System.currentTimeMillis() + 60 * 60 * 1000)) // 设置过期时间(一个小时后失效) .signWith(SignatureAlgorithm.HS512,SECRET_KEY.getBytes()) .compact(); } public boolean validateToken(String token) { try{ Jwts.parser().setSigningKey(SECRET_KEY.getBytes()).parseClaimsJws(token); return true; }catch(Exception e){ return false; // 如果token无效则返回false } } } ``` 此代码片段展示了基本的 token 生成逻辑以及校验逻辑。 ### 3. 实现 Refresh Token 功能 对于长期会话管理来说,通常还需要支持 refresh token 来延长用户的登录状态而无需频繁重新输入凭据。refresh token 应当比 access token 拥有更长的有效期限并且应当保存于安全位置如数据库内。下面是一个简单的刷新流程概述: #### (1)存储 refresh tokens 到 Redis 或 数据库。 每创建一个新的 session 就将关联的 refresh token 存入持久化层中。 #### (2)检查是否允许基于现有的 refresh token 请求新的 access token。 这一步可以包含对当前用户权限、IP 地址等附加信息的安全审核过程。 #### 示例:Refresh Service 类 ```java @Service public class RefreshService { @Autowired private UserRepository userRepository; /** * 使用旧的 refreshToken 获取token 对象 */ public AuthenticationResponse refreshTokens(AuthenticationRequest request) throws Exception { String refreshedAccessToken = jwtUtil.generateToken(request.getUsername()); if(validateOldRefreshToken(request.getRefreshToken())){ saveNewRefreshTokenToDb(refreshedAccessToken,request.getUsername()); return new AuthenticationResponse(refreshedAccessToken,"new-refresh-token"); } throw new BadCredentialsException("Invalid refresh token."); } private void saveNewRefreshTokenToDb(String newRefreshToken,String username){ User user=userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User Not Found with username: " + username)); user.setRefreshToken(newRefreshToken); userRepository.save(user); } private Boolean validateOldRefreshToken(String oldRefreshToken){ ... } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值