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

在React应用中,从Cookie中获取Token通常需要进行以下几个步骤: 1. **浏览器访问**: 首先,当用户登录时,服务器会将Token设置为Cookie,并返回给客户端(通常是前端)。React组件作为用户的界面层,并不会直接操作Cookie,它依赖于浏览器的JavaScript API。 2. **JavaScript API**: 使用JavaScript的`document.cookie`属性可以读取所有的Cookie。例如,你可以这样做: ```javascript function getTokenFromCookie() { const cookies = document.cookie.split(';'); for (let i = 0; i < cookies.length; i++) { const cookiePair = cookies[i].trim().split('='); if (cookiePair[0] === 'your_cookie_name') { // 替换为实际的cookie名 return decodeURIComponent(cookiePair[1]); // 解码Token值 } } return null; } ``` 3. **状态管理**: 获取Token后,通常需要将其保存在一个应用程序的状态管理库(如Redux、MobX或React Context)里,以便在整个应用生命周期内使用。例如,在Redux中: ```javascript import { useSelector } from 'react-redux'; function useToken() { const token = useSelector(state => state.token); // 如果未找到Token,可以从Cookie获取 return token || getTokenFromCookie(); } // 使用这个hook的地方 const App = () => { const token = useToken(); //... }; ``` 4. **安全性注意事项**: 一定要注意,尽管Cookie有时用于存储敏感信息,但它们不是安全的存储手段,因为它们是明文传输的。如果Token包含敏感信息,最好使用更安全的方式,如本地存储或JWT(JSON Web Tokens)。 **相关问题:** 1. 怎么处理过期的Cookie中的Token? 2. 使用React如何避免跨域访问时Cookie的问题? 3. Redux之外,还有哪些状态管理方案可以结合使用获取和存储Token?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值