token生成与解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | <br><br><br> public class AppJwtUtil { // TOKEN的有效期一天(S) private static final int TOKEN_TIME_OUT = 3_600; // 加密KEY private static final String TOKEN_ENCRY_KEY = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY" ; // 最小刷新间隔(S) private static final int REFRESH_TIME = 300 ; // 生产ID public static String getToken(Long id){ Map<String, Object> claimMaps = new HashMap<>(); claimMaps.put( "id" ,id); long currentTime = System.currentTimeMillis(); return Jwts.builder() .setId(UUID.randomUUID().toString()) .setIssuedAt( new Date(currentTime)) //签发时间 .setSubject( "system" ) //说明 .setIssuer( "heima" ) //签发者信息 .setAudience( "app" ) //接收用户 .compressWith(CompressionCodecs.GZIP) //数据压缩方式 .signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式 .setExpiration( new Date(currentTime + TOKEN_TIME_OUT * 1000 )) //过期时间戳 .addClaims(claimMaps) //cla信息 .compact(); } /** * 获取token中的claims信息 * * @param token . * @return . */ private static Jws<Claims> getJws(String token) { return Jwts.parser() .setSigningKey(generalKey()) .parseClaimsJws(token); } /** * 获取payload body信息 * * @param token . * @return . */ public static Claims getClaimsBody(String token) { try { return getJws(token).getBody(); } catch (ExpiredJwtException e){ return null ; } } /** * 获取hearder body信息 * * @param token . * @return . */ public static JwsHeader getHeaderBody(String token) { return getJws(token).getHeader(); } /** * 是否过期 * * @param claims . * @return -1:有效,0:有效,1:过期,2:过期 */ public static int verifyToken(Claims claims) { if (claims== null ){ return 1 ; } try { claims.getExpiration() .before( new Date()); // 需要自动刷新TOKEN if ((claims.getExpiration().getTime()-System.currentTimeMillis())>REFRESH_TIME* 1000 ){ return - 1 ; } else { return 0 ; } } catch (ExpiredJwtException ex) { return 1 ; } catch (Exception e){ return 2 ; } } /** * 由字符串生成加密key * * @return . */ public static SecretKey generalKey() { byte [] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes()); SecretKey key = new SecretKeySpec(encodedKey, 0 , encodedKey.length, "AES" ); return key; } public static void main(String[] args) { /* Map map = new HashMap(); map.put("id","11");*/ System.out.println(AppJwtUtil.getToken(1102L)); Jws<Claims> jws = AppJwtUtil.getJws( "eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQqEMAwA_5KzhURNt_qb1KZYQSi0wi6Lf9942NsMw3zh6AVW2DYmDGl2WabkZgreCaM6VXzhFBfJMcMARTqsxIG9Z888QLui3e3Tup5Pb81013KKmVzJTGo11nf9n8v4nMUaEY73DzTabjmDAAAA.4SuqQ42IGqCgBai6qd4RaVpVxTlZIWC826QA9kLvt9d-yVUw82gU47HDaSfOzgAcloZedYNNpUcd18Ne8vvjQA" ); Claims claims = jws.getBody(); System.out.println(claims.get( "id" )); } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(二):用.NET IoT库
· 几个自学项目的通病,别因为它们浪费了时间!
· 在外漂泊的这几年总结和感悟,展望未来
· .NET 数据拷贝方案选择
· .net工作流elsa-书签