1 package com.pipihao.blog.util;
2 import java.util.Date;
3
4 import javax.crypto.SecretKey;
5 import javax.crypto.spec.SecretKeySpec;
6
7 import org.apache.commons.codec.binary.Base64;
8
9 import com.alibaba.fastjson.JSONObject;
10 import io.jsonwebtoken.Claims;
11 import io.jsonwebtoken.ExpiredJwtException;
12 import io.jsonwebtoken.JwtBuilder;
13 import io.jsonwebtoken.Jwts;
14 import io.jsonwebtoken.MalformedJwtException;
15 import io.jsonwebtoken.SignatureAlgorithm;
16 import io.jsonwebtoken.SignatureException;
17 import io.jsonwebtoken.UnsupportedJwtException;
18
19 /**
20 * JWTUtils工具类,生成jwt和解析jwt
21 * JSON WEB TOKEN 结构组成:
22 * (1)Header(头部):包含加密算法,通常直接使用 HMAC SHA256
23 * (2)Payload(负载):存放有效信息,比如消息体、签发者、过期时间、签发时间等
24 * (3)Signature(签名):由header(base64后的)+payload(base64后的)+secret(秘钥)三部分组合,然后通过head中声明的算法进行加密
25 * @author sixmonth
26 * @date 2019年3月20日
27 *
28 */
29 public class JWTUtils {
30
31 static String SECRETKEY = "KJHUhjjJYgYUllVbXhKDHXhkSyHjlNiVkYzWTBac1Yxkjhuad";
32
33 /**
34 * 由字符串生成加密key
35 * @return
36 */
37 public static SecretKey generalKey(String stringKey) {
38 byte[] encodedKey = Base64.decodeBase64(stringKey);
39 SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
40 return key;
41 }
42
43 /**
44 * 创建jwt
45 * @param uuid 唯一id,uuid即可
46 * @param subject json形式字符串或字符串,增加用户非敏感信息存储,如用户id或用户账号,与token解析后进行对比,防止乱用
47 * @param expirationDate 生成jwt的有效期,单位秒
48 * @return jwt token
49 * @throws Exception
50 */
51 public static String createJWT(String uuid, String subject, long expirationDate) throws Exception {
52 SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
53 long nowMillis = System.currentTimeMillis();
54 Date now = new Date(nowMillis);
55 SecretKey key = generalKey(SECRETKEY);
56 JwtBuilder builder = Jwts.builder().setIssuer("").setId(uuid).setIssuedAt(now).setSubject(subject)
57 .signWith(signatureAlgorithm, key);
58 if (expirationDate >= 0) {
59 long expMillis = nowMillis + expirationDate*1000;
60 Date exp = new Date(expMillis);
61 builder.setExpiration(exp);
62 }
63 return builder.compact();
64 }
65
66 /**
67 * 解密jwt,获取实体
68 * @param jwt
69 */
70 public static Claims parseJWT(String jwt) throws ExpiredJwtException, UnsupportedJwtException,
71 MalformedJwtException, SignatureException, IllegalArgumentException {
72 SecretKey key = generalKey(SECRETKEY);
73 Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(jwt).getBody();
74 return claims;
75 }
76
77 /**
78 * 实例演示
79 */
80 public static void main(String[] args) {
81 try {
82 JSONObject subject = new JSONObject(true);
83 subject.put("tem", "哈哈哈");
84 subject.put("userName", "sixmonth");
85 String token = createJWT(UUIDUtils.getUUID(), subject.toJSONString(), 10);//10秒过期
86 //System.out.println(token);
87 Claims claims = parseJWT(token);
88 System.out.println("解析jwt:"+claims.getSubject());
89 JSONObject tem = JSONObject.parseObject(claims.getSubject());
90 System.out.println("获取json对象内容:"+tem.getString("userName"));
91 System.out.println(claims.getExpiration()+"///"+claims.getExpiration().getTime());
92 } catch (Exception e) {
93 e.printStackTrace();
94 }
95 }
96 }
97

jwtUtils顾名思意的更多相关文章

  1. 跟我一起云计算(5)——Shards

    什么是sharding Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库 (server)上,从而缓解单一数据库的性能问题.不太严格的讲,对于海量数据的数据库,如果是因为表多而 ...

  2. 理解SVG的viewport,viewBox,preserveAspectRatio

    万丈高楼平地起,基础很重要. viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="500" height="30 ...

  3. CSS 中关于background 属性功能

    background 是 css中的核心属性,我们对他应该充分了解. background-image   定义背景图像  这个属性是我们用的最多的属性 设置背景图像有两个方式 background: ...

  4. Android 如何判断一个应用在运行(转)

    Android 如何判断一个应用在运行  在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManag ...

  5. RSync实现文件备份同步

    [rsync实现网站的备份,文件的同步,不同系统的文件的同步,如果是windows的话,需要windows版本cwrsync] 一.什么是rsync rsync,remote synchronize顾 ...

  6. currentColor-CSS3非常有用的变量

    一.currentColor-简介 currentColor顾名思意就是“当前颜色”,准确讲应该是“当前的文字颜色”,例如: .xxx { border: 1px solid currentColor ...

  7. vim基本命令之剪切复制粘贴替换

    首先是剪切(删除): 剪切其实也就顺带删除了所选择的内容,所以既可以当剪切命令用,也可以当删除命令使用. 1 首先,可以在命令模式下输入v进入自由选取模式,选择需要剪切的文字后,按下d就可以进行剪切了 ...

  8. height与line-height的深入理解及应用

    转载:原文地址:http://www.zhangxinxu.com/wordpress/?p=384 一.前言 前两天在腾讯ISD团队博客上看到一篇翻译的文章"深入理解css 行高" ...

  9. vi、vim 查找替换

    vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询.    :s/vivian/sky/ 替换当前行第一个 vivian ...

随机推荐

  1. Photon Server伺服务器在LoadBalancing的基础上扩展登陆服务

    一,如何创建一个Photon Server服务 参见此博客 快速了解和使用Photon Server 二, 让LoadBalancing与自己的服务一起启动 原Photonserver.config文 ...

  2. 面试【JAVA基础】集合类

    1.ArrayList的扩容机制 每次扩容是原来容量的1.5倍,通过移位的方法实现. 使用copyOf的方式进行扩容. 扩容算法是首先获取到扩容前容器的大小.然后通过oldCapacity (oldC ...

  3. oracle数据库创建数据库实例-九五小庞

    oracle数据库创建数据库实例

  4. Mysql慢查询(分析工具)

    慢查询分析工具[mysqldumpslow] 常用的慢查询日志分析工具 汇总除查询条件外其他完全相同的SQL,并将分析结果按照参数中所指定的顺序输出 语法: mysqldumpslow -s r -t ...

  5. 【BIM】基于BIMFACE的空间拆分与合并

    BIMFACE中矩形空间拆分与合并 应用场景 在BIM运维场景中,空间同设备一样,作为一种资产被纳入运维管理体系,典型的应用场景例如商铺.防火分区等,这就涉及到空间的拆分和合并,在bimface中,已 ...

  6. spring cloud 通过zuul网关去请求的时候报404的几个原因。

    spring cloud 中 zuul 网关的那些坑: 1.检查你的服务是否正常启动. 2.检查你的服务是否正常注册到注册中心. 3.zuul网关的路由规则是会把你注册在注册中心的serviceId ...

  7. 鼠标移到图片上图片放大【css3实例】

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. js拖拽原理及简单实现(渣渣自学)

    第一步 首先简单分析下需求吧,我们就是想实现鼠标拖拽带颜色的方块时,让方块停留在鼠标松开的位置,需要计算的就是拖拽前的坐标和拖拽后的坐标,鼠标移动后相对于原位置的偏移量=目标元素的偏移量,根据这个等式 ...

  9. SpringBoot版不需要配置文件注解获取当前登录用户

    本文讯(2019年3月30日 飞快的蜗牛博客)   我是一个懒人,很久不写博客,想起来看到也不一定会写,只有心血来潮的时候写写,"钱塘江上潮信来,今日方知我是我"...... 空杯 ...

  10. 真正的解决IDEA中Tomcat控制台乱码的问题

    真正的解决IDEA中Tomcat控制台乱码的问题 解决方案一 网上看到一个真正的解决方案: 首先要分清是tomcat日志编码,与idea的日志显示控制台编码 tomcat日志编码:当在cmd中启动To ...