生成token的工具类
注意引入的依赖的版本,和工具类是否匹配,不然报错
以下token工具类,需要的依赖:
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version>
</dependency>
package com.sangeng.utils;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;/*** JWT工具类*/
public class JwtUtil {//有效期为public static final Long JWT_TTL = 60 * 60 *1000L;// 60 * 60 *1000 一个小时//设置秘钥明文public static final String JWT_KEY = "sangeng";public static String getUUID(){String token = UUID.randomUUID().toString().replaceAll("-", "");return token;}/*** 生成jtw* @param subject token中要存放的数据(json格式)* @return*/public static String createJWT(String subject) {JwtBuilder builder = getJwtBuilder(subject, null, getUUID());// 设置过期时间return builder.compact();}/*** 生成jtw* @param subject token中要存放的数据(json格式)* @param ttlMillis token超时时间* @return*/public static String createJWT(String subject, Long ttlMillis) {JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());// 设置过期时间return builder.compact();}private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;SecretKey secretKey = generalKey();long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);if(ttlMillis==null){ttlMillis=JwtUtil.JWT_TTL;}long expMillis = nowMillis + ttlMillis;Date expDate = new Date(expMillis);return Jwts.builder().setId(uuid) //唯一的ID.setSubject(subject) // 主题 可以是JSON数据.setIssuer("sg") // 签发者.setIssuedAt(now) // 签发时间.signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥.setExpiration(expDate);}/*** 创建token* @param id* @param subject* @param ttlMillis* @return*/public static String createJWT(String id, String subject, Long ttlMillis) {JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);// 设置过期时间return builder.compact();}public static void main(String[] args) throws Exception {
// String jwt = createJWT("2123");Claims claims = parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIyOTY2ZGE3NGYyZGM0ZDAxOGU1OWYwNjBkYmZkMjZhMSIsInN1YiI6IjIiLCJpc3MiOiJzZyIsImlhdCI6MTYzOTk2MjU1MCwiZXhwIjoxNjM5OTY2MTUwfQ.NluqZnyJ0gHz-2wBIari2r3XpPp06UMn4JS2sWHILs0");String subject = claims.getSubject();System.out.println(subject);
// System.out.println(claims);}/*** 生成加密后的秘钥 secretKey* @return*/public static SecretKey generalKey() {byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");return key;}/*** 解析** @param jwt* @return* @throws Exception*/public static Claims parseJWT(String jwt) throws Exception {SecretKey secretKey = generalKey();return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody();}}
以下工具类都可以,版本号限制不大
public class JwtTokenUtil {public static final String CLAIM_KEY_USERNAME = "sub";public static final String CLAIM_KEY_CREATED = "created";@Value("${jwt.secret}")//从properties文件里取值private String secret;@Value("${jwt.expiration}")//从properties文件里取值private Long expiration;//生成tokenpublic String generateToken(User user) {String originPhoneNum = SecretUtil.desEncrypt(user.getPhoneNum(),"1234567890123456","1234567890123456");// 准备荷载Map<String,Object> claims = new HashMap<>();claims.put(CLAIM_KEY_USERNAME, user.getUsername());claims.put(CLAIM_KEY_CREATED,new Date());return generateToken(claims);}//根据荷载生成tokenprivate String generateToken(Map<String,Object> claims){return Jwts.builder().setClaims(claims).setExpiration(generateExpirationDate()).signWith(SignatureAlgorithm.ES512,secret).compact();}//生成token失效时间private Date generateExpirationDate() {return new Date(System.currentTimeMillis()+expiration*1000);}//检验token// 根据token获取用户信息,usernamepublic String getUserDetailsFromToken(String token){String username;//获取荷载try{Claims claims = getClaimsFromToken(token);username = claims.getSubject();}catch (Exception e){username=null;}return username;}
// 从token中获取荷载private Claims getClaimsFromToken(String token) {Claims claim = null;try{claim = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();}catch (Exception e){e.printStackTrace();}return claim;}// 检验token是否有效public boolean validateToken(String token, UserDetails userDetails){// 1、token是否过期boolean tokenExpired = isTokenExpired(token);
// 2、用户名是否相等String username = getUserDetailsFromToken(token);return (username.equals(userDetails.getUsername()) && !tokenExpired);}
// 判断token是否失效private boolean isTokenExpired(String token) {
// 获取token失效时间Date expireDate = getExpiredDateFromToken(token);
// 判断expireDate在当前时间前面,则token失效return expireDate.before(new Date());}// 获取token失效时间private Date getExpiredDateFromToken(String token) {Claims claims = getClaimsFromToken(token);return claims.getExpiration();}// 判断token是否可以被刷新 token 没过期就可以刷新public boolean canRefreash(String token){return !isTokenExpired(token);}//刷新token 实际只修改过期时间public String refreashToken(String token){//获取荷载Claims claims = getClaimsFromToken(token);//修改过期时间claims.put(CLAIM_KEY_CREATED,new Date());//根据荷载生成tokenreturn generateToken(claims);}
}
生成token的工具类相关推荐
- java生成验证码工具类_Java生成图形验证码工具类
生成验证码效果 validatecode.java 验证码生成类 package cn.dsna.util.images; import java.awt.color; import java.awt ...
- 阿里云实人认证生成签名SignNature工具类
此类是有时间写的,使用阿里云给出的demo测试正确.实际在调用阿里云的实人认证接口时并未用到,可直接集成相关的sdk. 代码 package cn.com.chnsys.utils;import ja ...
- java生成圆_java工具类-java实现 生成圆头像
1.创建RoundHeadImgUtils工具类 package com.mrd.utils; import javax.imageio.ImageIO; import java.awt.*; imp ...
- 根据时间戳生成订单号工具类
生成订单时候,需要订单号,订单号生成工具如下: 效果: @Testpublic static void main(String[] args) {System.out.println("现在 ...
- 【Java】登录操作中随机生成验证码的工具类
效果图: 工具类CreateImageCode.java: import java.awt.Color; import java.awt.Font; import java.awt.Graphics; ...
- java 生成UUID字符串工具类 UUIDUtil
package com.xj.hhjk.common.util.security; import java.util.UUID; import java.util.regex.Matcher; imp ...
- java 生成水印图片工具类, MultipartFile接收上传的图片,处理成加水印之后的MultipartFile
/*** Created by Administrator on 2018/4/26.* JAVA图片处理工具*/ public class ImageUtil {public enum positi ...
- java 导出mdb文件_Java中Java生成mdb文件工具类
package com.util; /** * Java生成mdb文件[MS Access文件] * 1. 在ClassPath下存一个空的blank.mdb. (也就是在你的项目中包含一个空白的 ...
- 后端生成Token架构与设计详解
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:巨 ...
最新文章
- HTTP详解(1)-工作原理【转】
- 22条API设计的实践
- 城市运行一网统管_全国率先!“一屏观天下、一网管全城”,临港城市运行“一网统管”平台启动建设...
- Excel 2016新增函数之IFS
- Node.js新手教程——怎样实现文件上传功能
- 决策树分类算法matlab,matlab实现的C45分类决策树算法
- JS精粹知识点和我的解释
- php100视频教程html,PHP100视频教程48:Ajax+PHP快速上手及应用
- JAVA中ResourceBundle使用详解(一)
- 案例: 模拟京东快递单号查询
- 植物大战僵尸 - 修改关卡和商店金钱
- 130行Python代码模仿“蚂蚁呀嘿”特效,太魔性了!
- 28句最精辟有哲理的生活感悟说说,经典至极,总有一句说到你的心里
- 关于微信小程序与Java后台交互数据中中文乱码问题的讨论
- 不要与最好的朋友合伙开公司?对吗
- 尚医通 (二十)就诊人用户管理 | 平台用户管理
- Chrome浏览器首页被hao123劫持的解决办法
- 【深度学习】详解Faster-R-CNN
- java 判断ftp文件是否存在_java如何检验ftp服务器中指定文件是否存在
- 挠性电路板和刚性电路板的区别,以及柔性电路板焊接方法操作步骤
热门文章
- 电梯控制系统的实现(代码简洁优质、易懂)
- Google Android 开发者网站更新了
- ICASSP 2022 | 前沿音视频成果分享:基于可变形卷积的压缩视频质量增强网络
- asterisk安装步骤
- 如何在windows平台下造字
- 证据确凿!360,彻头彻尾的木马?
- Java中保留两位小数,和kotlin保留两位小数
- 笔试——2019方正FPGA
- JS流程控制语句 反反复复(while循环) 和for循环有相同功能的还有while循环, while循环重复执行一段代码,直到某个条件不再满足。...
- Matlab AppDesigner编程教程第1章——面向对象编程