jwt的token生成和解析

import com.auth0.jwt.JWTSigner;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtils {

    private static  final String SECRET="***********";

    private static final String EXP="exp";

    private static final String PAYLOAD="payload";

    /**
     * 加密
     * @param object 加密数据
     * @param maxTime 有效期(毫秒数)
     * @param <T>
     * @return
     */
    public static <T> String encode(T object,long maxTime){
        try{
            final JWTSigner signer=new JWTSigner(SECRET);
            final Map<String ,Object> data=new HashMap<>(10);
            ObjectMapper objectMapper=new ObjectMapper();
            String jsonString=objectMapper.writeValueAsString(object);
            data.put(PAYLOAD,jsonString);
            data.put(EXP,System.currentTimeMillis()+maxTime);
            return signer.sign(data);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 数据解密
     * @param jwt 解密数据
     * @param tClass 解密类型
     * @param <T>
     * @return
     */
    public static <T> T decode(String jwt,Class<T> tClass){
        final JWTVerifier jwtVerifier=new JWTVerifier(SECRET);
        try{
            final Map<String,Object> data=jwtVerifier.verify(jwt);
            //判断数据是否超时或者符合标准
            if(data.containsKey(EXP)&&data.containsKey(PAYLOAD)){
                long exp= (long) data.get(EXP);
                long currentTimeMillis=System.currentTimeMillis();
                if(exp>currentTimeMillis){
                    String json= (String) data.get(PAYLOAD);
                    ObjectMapper objectMapper=new ObjectMapper();
                    return objectMapper.readValue(json,tClass);
                }
            }
            return null;
        }catch (Exception e){
            e.printStackTrace();
            return null;
        }
    }

    public static String jjwtEncode(String userId,long maxTime){
        JwtBuilder jwtBuilder = Jwts.builder().setId(userId)
                .setSubject(userId)
                .setIssuedAt(new Date())
                .signWith(SignatureAlgorithm.HS256, SECRET)
                .setExpiration(new Date(new Date().getTime() + maxTime));
        String jjwtToken = jwtBuilder.compact();
        return jjwtToken;
    }

    public static String jjwtDecode(String token){
        Claims claims = Jwts.parser().setSigningKey(SECRET)
                .parseClaimsJws(token)
                .getBody();
        String id = claims.getId();
        return id;
    }

    public static void main(String[] args) {
        //String s = jjwtEncode("3523ggeheeeeeeee", 30000);
        //System.out.println(s);
        //String s1 = jjwtDecode(s);
        //System.out.println(s1);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准,可以在应用程序和服务之间安全地传输声明。下面是使用Java编写JWT生成器和解析器的示例代码。 首先,你需要使用Maven或Gradle添加以下依赖项: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 然后,你可以使用以下代码生成JWT: ```java import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtGenerator { private static final String SECRET_KEY = "your-secret-key"; // 你的密钥 public static String generateJwt(String subject, long ttlMillis) { // 设置签名算法和密钥 SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; byte[] apiKeySecretBytes = SECRET_KEY.getBytes(); Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); // 设置过期时间 long nowMillis = System.currentTimeMillis(); Date now = new Date(nowMillis); Date expiration = new Date(nowMillis + ttlMillis); // 创建JWT JwtBuilder builder = Jwts.builder() .setIssuedAt(now) .setSubject(subject) .setExpiration(expiration) .signWith(signatureAlgorithm, signingKey); // 返回JWT return builder.compact(); } } ``` 在上面的代码中,`generateJwt`方法接受一个主题和一个时间戳(以毫秒为单位),并返回一个JWT字符串。使用`setIssuedAt`方法设置JWT的发行时间,使用`setSubject`方法设置JWT的主题,使用`setExpiration`方法设置JWT的过期时间,并使用`signWith`方法设置签名算法和密钥。 接下来,你可以使用以下代码解析JWT: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; public class JwtParser { private static final String SECRET_KEY = "your-secret-key"; // 你的密钥 public static String parseJwt(String jwt) { // 解析JWT Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY.getBytes()) .parseClaimsJws(jwt) .getBody(); // 返回JWT主题 return claims.getSubject(); } } ``` 在上面的代码中,`parseJwt`方法接受一个JWT字符串,并返回JWT的主题。使用`setSigningKey`方法设置解析JWT时使用的密钥,并使用`parseClaimsJws`方法解析JWT。最后,使用`getBody`方法获取JWT的声明。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sylarjyd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值