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. 揭秘!containerd 镜像文件丢失问题,竟是镜像生成惹得祸

    导语 作者李志宇,腾讯云后台开发工程师,日常负责集群节点和运行时相关的工作,熟悉 containerd.docker.runc 等运行时组件.近期在为某位客户提供技术支持过程中,遇到了 contain ...

  2. 【Android】listview 嵌套gridview报错,代码:”during second layout pass: posting in next frame

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, QQ986945193 公众号:程序员小冰 说明:本人曾经在listview嵌套gridview出现 ...

  3. 【原】通过Jenkin传值进Android代码

    1) Jenkin中用-Pxxxx = yyyy来传值进gradle 2) 在AndroidManifest.xml中定义占位符: <meta-data android:name="X ...

  4. docker 修改容器配置文件

    启动docker镜像命令docker run 可以指定端口映射,但是容器一旦创建就无法在通过命令修改.通常是保存镜像在创建一个新的容器.有没有办法不保存镜像直接修改这个容器呢?答案是有的,本文已mys ...

  5. vue项目前端导出word文件(bug解决)

    摘要:之前项目中导出价格表是由后端实现,前端只需要调用接口下载word即可,后来业务改变比较大,word模版需要一直改动,后端改起来相对麻烦,后来直接前端自己定义模版,实现下载word文档. 一.需要 ...

  6. 【GDKOI2004】汉诺塔

    题目描述 古老的汉诺塔问题是这样的:用最少的步数将N个半径互不相等的圆盘从1号柱利用2号柱全部移动到3号柱,在移动的过程中小盘要始终在大盘的上面. 现在再加上一个条件:不允许直接把盘从1号柱移动到3号 ...

  7. pycharm写的代码提交到git上,提示需要merge失败时解决办法

    当遇到pycharm代码提交需要合并报错时 原因:pycharm目录和git中目录冲突了 解决办法:1.先在git仓库中创建一个文件夹,比如day1 2.然后在pycharm中update一下,可以看 ...

  8. Django设置前端背景图片

    设置 setting.py 文件 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static&qu ...

  9. Typora基础使用

    Markdown学习 标题 三级标题 四级标题 字体 Hello,World! Hello,World! Hello,World! Hello,World! 引用 选择狂神说Java,走向人生巅峰 分 ...

  10. 从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Javax,Jakarta

    从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Javax,Jakarta 目录 从一次编译出发梳理概念: Jetty,Jersey,hk2,glassFish,Jav ...