JAVA结合 JSON Web Token(JWT) 工具类
阅读原文时间:2023年07月09日阅读:1

引入java-jwt-3.3.0.jar 、  jjwt-0.9.0.jar 、jackson-all-1.7.6.jar

或者maven


com.auth0 java-jwt 3.3.0

    <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->  
    <dependency>  
        <groupId>io.jsonwebtoken</groupId>  
        <artifactId>jjwt</artifactId>  
        <version>0.9.0</version>  
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->  
    <dependency>  
        <groupId>org.codehaus.jackson</groupId>  
        <artifactId>jackson-mapper-asl</artifactId>  
        <version>1.7.0</version>  
    </dependency>

JWTUtils.java

import io.jsonwebtoken.*;
import org.codehaus.jackson.map.ObjectMapper;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

/**
* @author yvioo。
*/

public class JWTUtils {

/\*\*  
 \* 服务器的kye.用户做加解密的key数据。  
 \*/  
private static final String JWT\_SECERT = "23asfeferfggrtg";

private static final ObjectMapper MAPPER = new ObjectMapper();

public static SecretKey generalKey() {  
    try {  
        byte\[\] encodedKey = JWT\_SECERT.getBytes("UTF-8");  
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");  
        return key;  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return null;  
}

/\*\*  
 \* 签发JWT,创建token的方法  
 \*  
 \* @param id        jwt的唯一标识,主要用来做一次性token。  
 \* @param iss       jwt签发者  
 \* @param subject   jwt所面向的用户。一般使用用户的登录名  
 \* @param headerMap 请求头map集合  
 \* @param ttlMillis 有效期,单位毫秒  
 \* @return token 是为一个用户的有效登录周期准备的一个token 。用户退出或超时,token失效  
 \*/  
public static String createJWT(String id, String iss, String subject, Map<String, Object> headerMap, long ttlMillis) {  
    try {  
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;  
        long nowMilllis = System.currentTimeMillis();  
        Date now = new Date(nowMilllis);  
        SecretKey secretKey = generalKey();  
        JwtBuilder builder = Jwts.builder()  
                .setId(id)  
                .setIssuer(iss)  
                .setSubject(subject)  
                //token生成时间  
                .setIssuedAt(now)  
                //设置密匙和算法  
                .signWith(signatureAlgorithm, secretKey);  
        if (headerMap != null) {  
            builder.setHeaderParams(headerMap);  
        }  
        if (ttlMillis > 0) {  
            long expMillis = nowMilllis + ttlMillis;  
            Date expDate = new Date(expMillis);  
            builder.setExpiration(expDate);  
        }  
        return builder.compact();  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return null;  
}

/\*\*  
 \* 解析JWT字符串  
 \*  
 \* @param jwt 就是生成的toekn  
 \* @return  
 \*/  
public static Claims parseJWT(String jwt) {  
    SecretKey secretKey = generalKey();  
    return Jwts.parser()  
            .setSigningKey(secretKey)  
            .parseClaimsJws(jwt)  
            .getBody();  
}

/\*\*  
 \* 解析JWT请求头字符串  
 \* @param jwt 就是生成的toekn  
 \* @return  
 \*/  
public static JwsHeader parseJwsHeader(String jwt) {  
    SecretKey secretKey = generalKey();  
    return Jwts.parser()  
            .setSigningKey(secretKey)  
            .parseClaimsJws(jwt)  
            .getHeader();  
}

/\*\*  
 \* 验证jwt  
 \*  
 \* @param jwtStr  
 \* @return  
 \*/  
public static boolean validateJWT(String jwtStr) {  
    Claims claims = null;  
    try {  
        claims = parseJWT(jwtStr);  
        return true;  
        //成功  
    } catch (ExpiredJwtException e) {  
        //token过期  
        return false;  
    } catch (Exception e) {  
        return false;  
    }  
}

public static String generalSubject(Object subject) {  
    try {  
        return MAPPER.writeValueAsString(subject);  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return subject + "";  
}

public static void main(String\[\] args) {  
    Map<String, Object> param = new LinkedHashMap<>();  
    param.put("code", "1222");  
    String jwtToken = JWTUtils.createJWT("1", "test-jwt", JWTUtils.generalSubject("yvioo"), param, 1 \* 60 \* 1000);  
    System.out.println(jwtToken);  
    Claims claims = parseJWT(jwtToken);  
    System.out.println(claims.getId());  
    JwsHeader jwsHeader = parseJwsHeader(jwtToken);  
    System.out.println(jwsHeader.get("code"));

}

/\*\*  
 \* 获取接口放在header中的token  
 \*  
 \* @param request  
 \*/  
public void test(HttpServletRequest request) {  
    //生成的token  
    String token = request.getHeader("Authorization");  
    //验证  
    boolean result = JWTUtils.validateJWT(token);  
}

}