jwtUtils顾名思意
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顾名思意的更多相关文章
- 跟我一起云计算(5)——Shards
什么是sharding Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库 (server)上,从而缓解单一数据库的性能问题.不太严格的讲,对于海量数据的数据库,如果是因为表多而 ...
- 理解SVG的viewport,viewBox,preserveAspectRatio
万丈高楼平地起,基础很重要. viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="500" height="30 ...
- CSS 中关于background 属性功能
background 是 css中的核心属性,我们对他应该充分了解. background-image 定义背景图像 这个属性是我们用的最多的属性 设置背景图像有两个方式 background: ...
- Android 如何判断一个应用在运行(转)
Android 如何判断一个应用在运行 在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManag ...
- RSync实现文件备份同步
[rsync实现网站的备份,文件的同步,不同系统的文件的同步,如果是windows的话,需要windows版本cwrsync] 一.什么是rsync rsync,remote synchronize顾 ...
- currentColor-CSS3非常有用的变量
一.currentColor-简介 currentColor顾名思意就是“当前颜色”,准确讲应该是“当前的文字颜色”,例如: .xxx { border: 1px solid currentColor ...
- vim基本命令之剪切复制粘贴替换
首先是剪切(删除): 剪切其实也就顺带删除了所选择的内容,所以既可以当剪切命令用,也可以当删除命令使用. 1 首先,可以在命令模式下输入v进入自由选取模式,选择需要剪切的文字后,按下d就可以进行剪切了 ...
- height与line-height的深入理解及应用
转载:原文地址:http://www.zhangxinxu.com/wordpress/?p=384 一.前言 前两天在腾讯ISD团队博客上看到一篇翻译的文章"深入理解css 行高" ...
- vi、vim 查找替换
vi/vim 中可以使用 :s 命令来替换字符串.该命令有很多种不同细节使用方法,可以实现复杂的功能,记录几种在此,方便以后查询. :s/vivian/sky/ 替换当前行第一个 vivian ...
随机推荐
- day42:HTML标签和CSS选择器
目录 1.HTML 1.1 文档结构 1.2 head标签 1.3 body标签 1.3.1 h1-h6标签 1.3.2.br标签:换行 1.3.3.hr标签:一行横线 1.3.4 a标签:超链接标签 ...
- AQI分析
A Q I 分 析 1.背景信息 AOI( Air Quality Index),指空气质量指数,用来衡量空气清洁或污染的程度.值越小,表示空气质量越好.近年来,因为环境问题,空气质量也越来越受到人 ...
- OpenCV(Open Source Computer Vision Library)计算机视觉库
OpenCV(最基本的滤波到高级的物体检测皆有涵盖) 简介: OpenCV 是跨平台的,可以在 Windows.Linux.Mac OS.Android.iOS 等操作系统上运行. OpenCV 的 ...
- jumpserver如何在远程时使用复制粘贴-windwos系统下
jumpserver堡垒机搭建好了,但是在使用的时候,有时候会出现远程下不能复制粘贴,这让体验十分不爽. 于是着手解决这个问题,附上参考链接,感谢大佬:http://itren.xiaolee.net ...
- Queries for Number of Palindromes(区间dp)
You've got a string s = s1s2... s|s| of length |s|, consisting of lowercase English letters. There a ...
- [oracle/sql]关于清除重复,not in方案和not exists方案的对比
有这样一张表: CREATE TABLE tb_sc ( id NUMBER not null primary key, studentid int not null, courseid int no ...
- cannary
canary是Linux为防止栈溢出的一种保护机制,接着我们分析glibc对canary的实现过程,首先给出跟canary相关的调用栈: security_init() //在elf/rtld.c中 ...
- 用了这个jupyter插件,我已经半个月没打开过excel了
1 简介 jupyter lab是我迄今为止体验过开展数据分析等任务最舒适的平台,但这不代表它是完美的,因为在很多方面它仍然存在欠缺,譬如在对csv文件的交互式编辑方面. 图1 而本文将要介绍的jup ...
- .NET多线程(Thread,ThreadPool,Task,Async与Await)
.NET多线程是什么? 进程与线程 进程是一种正在执行的程序. 线程是程序中的一个执行流. 多线程是指一个程序中可以同时运行多个不同的线程来执行不同的任务. .NET中的线程 Thread是创建和控制 ...
- 转发请求RequestDispatcher()方法用于与页面的交互
jsp1代码 <form action="HelloServlet" > 账号: <input type="text" name=" ...