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 ...
随机推荐
- vue 在模板template中变量和字符串拼接
例子: :post-action="'/api/v1/reportPage/'+this.selectedPagerId+'/saveimg/'"
- fragment没有getWindowManager 关于fragment下的报错解决方法
其实很简单:只需要在getWindowManager().getDefaultDisplay().getMetrics(metric) 前面加上getactivity()即可.
- oeasy 教您玩转linux010101查看内核uname
linux([?l?n?ks]) 是什么????? 咱们这次讲点什么呢?这次咱们讲讲这个 linux([?l?n?ks]),什么是 linux([?l?n?ks])呢?这linux([?l?n?ks] ...
- Unity调用PC摄像头
转载于Unity3d圣典里面,具体哪位大侠写的我忘咯. using UnityEngine; using System.Collections; public class CameraTest : M ...
- FZU - 2038 -E - Another Postman Problem (思维+递归+回溯)
Chinese Postman Problem is a very famous hard problem in graph theory. The problem is to find a shor ...
- FIddlerd的下载教程和使用教程
------------恢复内容开始------------ .打开官网,官网下载地址是https://www.telerik.com/download/fiddler .打开以后选择你的相关信息如下 ...
- zookeeper与分布式系统
1.1. 分布式系统基础知识 一个tomcat打天下的时代,不能说完全淘汰了,在一个管理系统,小型项目中还经常使用,这并不过分,出于成本的考虑,这反而值得提倡. 1.1.1. 分布式系统是什么 分 ...
- .NET Core表达式树的梳理
最近要重写公司自己开发的ORM框架:其中有一部分就是查询的动态表达式:于是对这方面的东西做了一个简单的梳理 官网的解释: 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 ...
- 记一次线上OOM问题分析与解决
一.问题情况 最近用户反映系统响应越来越慢,而且不是偶发性的慢.根据后台日志,可以看到系统已经有oom现象. 根据jdk自带的jconsole工具,可以监视到系统处于堵塞时期.cup占满,活动线程数持 ...
- css的引用关系
总结:离div标签越近,越先被引用 先在同级目录下新建一个stylesheet(是以.css结尾的)注意:link引入进来的css中,class标签也是c1,因为html中div class=c1,因 ...