JWT工具类

JWT 工具类实现

import com.google.gson.Gson;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @describe:JWT
 *  使用场景:一种情况是webapi,另一种情况是多web服务器下实现无状态分布式身份验证。 JWT是JSON Web Token的缩写,即JSON Web令牌。JSON Web令牌(JWT)是一种紧凑的、URL安全的方式, 用来表示要在双方之间传递的“声明”。JWT中的声明被编码为JSON对象,用作JSON Web签名(JWS)结构的有效内容或JSON Web加密(JWE)结构的明文,使得声明能够被:数字签名、 或利用消息认证码(MAC)保护完整性、加密。
 * @author:houkai
 * @Date: 2018/3/26 16:49
 */
public class JwtUtil {

    /**
     * 解密
     * @param jsonWebToken
     * @param base64Security
     * @return
     */
    public static Claims parseJWT(String jsonWebToken, String base64Security) {
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(base64Security.getBytes())
                    .parseClaimsJws(jsonWebToken).getBody();
            return claims;
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }

    /**
     * 前三个参数为自己用户token的一些信息比如id,权限,名称等。不要将隐私信息放入(大家都可以获取到)
     * @param map
     * @param base64Security
     * @return
     */
    public static String createJWT(Map<String, Object> map, String base64Security) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        //添加构成JWT的参数
        JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT")
                .setPayload(new Gson().toJson(map))
                .signWith(signatureAlgorithm,base64Security.getBytes()); //估计是第三段密钥
        //生成JWT
        return builder.compact();
    }

    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("province", "898765");
        map.put("city", "898765");
        map.put("appkey", "HMu1H/cmyKDOiHv41Y9lLROuOlOo+PPG8F4/RotRmNc=");
        map.put("timestamp", new Date().getTime());

        //密钥
        String keyt = "79e7c69681b8270162386e6daa53d1dc";
        String token=JwtUtil.createJWT(map, keyt);
        System.out.println("JWT加密的结果:"+ token);
        System.out.println("JWT解密的结果:"+ parseJWT(token, keyt));
    } 
}

**代码需要的maven依赖**
        <!-- jwt 加密解密需要的 -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.0.1</version>
        </dependency>

        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.7.0</version>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
        </dependency>
### JWT 工具类实现示例 以下是基于 JavaJWT 工具类实现示例,该工具类支持创建和解析 JSON Web Token (JWT),并提供了签名验证功能以防止篡改[^2]。 ```java import io.jsonwebtoken.*; import java.util.Date; import java.util.Map; public class JwtUtils { private static final String SECRET_KEY = "your_secret_key"; // 替换为实际使用的密钥 /** * 创建 JWT * * @param claims 自定义载荷数据 * @param ttlMillis 过期时间(毫秒) * @return JWT 字符串 */ public static String createJwt(Map<String, Object> claims, long ttlMillis) { SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; long nowMillis = System.currentTimeMillis(); Date now = new Date(nowMillis); return Jwts.builder() .setClaims(claims) // 设置自定义载荷 .setIssuedAt(now) // 设置签发时间 .setExpiration(new Date(nowMillis + ttlMillis)) // 设置过期时间 .signWith(signatureAlgorithm, SECRET_KEY.getBytes()) // 使用 HMAC 签名算法和密钥进行签名 .compact(); } /** * 解析 JWT 并返回其中的 Claims 数据 * * @param jwtToken 待解析的 JWT 字符串 * @return Claims 对象 * @throws ExpiredJwtException 如果令牌已过期则抛出异常 * @throws UnsupportedJwtException 如果不支持当前令牌类型则抛出异常 * @throws MalformedJwtException 如果令牌格式错误则抛出异常 * @throws SignatureException 如果签名验证失败则抛出异常 */ public static Claims parseJwt(String jwtToken) throws JwtException { return Jwts.parserBuilder() .setSigningKey(SECRET_KEY.getBytes()) .build() .parseClaimsJws(jwtToken) .getBody(); } } ``` 上述代码实现了两个核心方法: 1. **`createJwt` 方法**:用于生带有指定有效时间和自定义载荷的 JWT。通过 `SignatureAlgorithm.HS256` 和预设的密钥对生的令牌进行签名,从而确保其不可被随意篡改。 2. **`parseJwt` 方法**:用于解析传入的 JWT,并提取其中的 Claims 数据。如果令牌已经过期、格式非法或者签名验证失败,则会分别抛出对应的异常[^3]。 --- ### 防止 JWT 被篡改的关键机制 为了防止 JWT 被恶意修改或伪造,在生 JWT 时会对整个头部和载荷部分计算哈希值,并将其作为签名附加到最终的字符串中。当接收方收到此令牌后,可以通过相同的密钥重新计算签名并与原始签名对比来验证其真实性。 例如,在上面的 `parseJwt` 方法中,调用了 `.setSigningKey(SECRET_KEY.getBytes())` 来设置解码所需的密钥。只有持有相同密钥的一方才能够功完校验过程;任何试图更改负载内容的行为都会破坏原有的签名结构,进而导致验证失败。 --- ### 测试 JWT 的有效期 下面展示了一个简单的单元测试用例,演示如何利用前面提到的工具类检测某个特定时间段内的 token 是否仍然可用: ```java @Test public void testJwtValidityPeriod() throws Exception { Map<String, Object> claims = Map.of("username", "testUser"); // 创建一个仅持续三秒钟的有效令牌 String shortLivedJwt = JwtUtils.createJwt(claims, 3_000L); Thread.sleep(4_000); // 让线程休眠超过设定时限 try { JwtUtils.parseJwt(shortLivedJwt); fail("Expected an exception due to expired token."); } catch (ExpiredJwtException e) { System.out.println("Caught expected expiration error: " + e.getMessage()); } } ``` 在此例子中,我们故意让程序等待超出预期存活周期后再尝试解读刚才生产的短命凭证。不出所料的话,应该触发相应的超时期限警告消息。 --- ####
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值