Java如何使用Jwt鉴权

这是一个关于JWT(JSON Web Token)的Java工具类,用于生成和验证JWT令牌。工具类包括生成普通JWT和临时JWT的方法,以及解析、校验和过期检查的功能。依赖了Apache Commons Lang和Auth0的java-jwt库。

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

首先是坐标

    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.6</version>
    </dependency>

    <dependency>
      <groupId>com.auth0</groupId>
      <artifactId>java-jwt</artifactId>
      <version>3.15.0</version>
    </dependency>

然后工具类

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.stereotype.Component;
import org.apache.commons.lang.StringUtils;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class JwtUtils {

    private static String secret = "secret key";
    private static long expire = 1*24*60*60;

    public static String objToStrTrim(Object obj) {
        return obj == null ? "" : obj.toString().trim();
    }

    /**
     * 生成jwt token
     */
    public static String generateToken(Map<String, Object> userInfo) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("openId", userInfo.get("openId"));
        map.put("sessionKey", userInfo.get("sessionKey"));
        String subject = objToStrTrim(userInfo.get("userId"));
        return baseToken(map,subject,expire);
    }

    /**
     * 生成jwt token 临时
     */
    public static String generateToken_h5(Map<String, Object> userInfo) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        map.put("userId", userInfo.get("userId"));
        String subject = objToStrTrim(userInfo.get("userId"));
        return baseToken(map,subject,60*60*1);
    }

    /**
     * 解析临时token
     * @return  true:过期
     */
    public static Map<String, String> parserToken_h5(String token) throws Exception{
        // 解密token
        Claims claims = JwtUtils.getClaimByToken(token);
        if(claims == null) {
            return null;
        }
        Map<String, String> map = new HashMap<String, String>();
        map.put("userId", (String)claims.get("userId"));
        return map;
    }

    /**
     * 生成jwt token
     */
    public static String baseToken(HashMap<String, Object> map,String subject,long expire_ms) {
        Date nowDate = new Date();
        return Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .addClaims(map)
                .setSubject(subject)
                .setIssuedAt(nowDate)
                .setExpiration(new Date(nowDate.getTime() + expire_ms * 1000))
                .signWith(io.jsonwebtoken.SignatureAlgorithm.HS512, secret)
                .compact();
    }


    public static Claims getClaimByToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(secret)
                    .parseClaimsJws(token)
                    .getBody();
        }catch (Exception e){
            return null;
        }
    }

    /**
     * token是否过期
     * @return  true:过期
     */
    public static boolean isTokenExpired(Claims claims) {
        Date expiration = claims.getExpiration();
        return expiration.before(new Date());
    }

    /**
     * 校验token是否合法
     * @return  true:过期
     */
    public static void validateToken(String requestUserId, Claims claims) throws Exception {

        if(StringUtils.isBlank(requestUserId) || claims == null || StringUtils.isBlank(claims.getSubject())) {
            throw new Exception("用户未登录");
        }

        String userId = claims.getSubject();
        // 用户Id一致校验
        if(!userId.equals(requestUserId)) {
            throw new Exception("用户未登录");
        }

        // token过期
        if(isTokenExpired(claims)) {
            throw new Exception("登录状态过期");
        }
    }

    /**
     * 解析sessionInfo
     * @return  true:过期
     */
    public static Map<String, String> parseMappSessionInfo(String token) {
        // 解密token
        Claims claims = JwtUtils.getClaimByToken(token);
        if(claims == null) {
            return null;
        }

        Map<String, String> sessionInfo = new HashMap<String, String>();
        sessionInfo.put("openId", (String)claims.get("openId"));
        sessionInfo.put("sessionKey", (String)claims.get("sessionKey"));
        return sessionInfo;
    }

    /**
     * 解析userInfo
     * @return  true:过期
     */
    public static Map<String, Object> parseUserInfo(String requestUserId, String token) throws Exception {
        // 解密token
        Claims claims = JwtUtils.getClaimByToken(token);
        if(claims == null) {
            return null;
        }

        // 校验用户Token
        validateToken(requestUserId, claims);

        Map<String, Object> userInfo = new HashMap<String, Object>();
        userInfo.put("userId", claims.getSubject());
        userInfo.put("openId", claims.get("openId"));
        userInfo.put("sessionKey", claims.get("sessionKey"));
        return userInfo;
    }
}

使用

Map<String, Object> dataMap = new HashMap<String, Object>();
        
dataMap.put("openId", "openId");
        
dataMap.put("sessionKey", "sessionKey");
        
dataMap.put("userId", "userId");
        
String token = JwtUtils.generateToken(dataMap);
        
System.out.println(token);

输出:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzZXNzaW9uS2V5Ijoic2Vzc2lvbktleSIsIm9wZW5JZCI6Im9wZW5JZCIsInN1YiI6InVzZXJJZCIsImlhdCI6MTYxODI4MjA1NSwiZXhwIjoxNjE4MzY4NDU1fQ.vO6P52tb_tIR8F8jlfDg3SiN6dI_XOtOHvYmWxYQguXG5nosjfz5Lkn50DQXOKHPoF30tD4K2VParLZke-KnDw

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值