导入JWT pom依赖

<!--JWT 依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
----------------------------------------------------------------------------
package com.woniuxy.config;

import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
* Description:JwtToken工具类
*
* @author: ykq11 <br/>
* Date: 2022/1/28:21:59 <br/>
*/
@Component
public class JwtTokenUtil {
private static final String CLAIM_KEY_USERNAME="sub";
private static final String CLAIM_KEY_CREATED = "created";
@Value("${jwt.secret}")
private String secret;
@Value("$jwt.expiration")
private Long expiration;

/**
* Description : 根据用户信息生成token <br/>
* ChangeLog : 1. 创建 (2022/1/28 22:08 [ykq11]);
** @param userDetails
* * @return java.lang.String
*/
public String generateToken(UserDetails userDetails){
Map<String, Object> claims = new HashMap<>();
claims.put(CLAIM_KEY_USERNAME,userDetails.getUsername());
claims.put(CLAIM_KEY_CREATED, new Date());
return generateToken(claims);
}
/**
* Description : TODO 根据荷载生成JWT Token <br/>
* ChangeLog : 1. 创建 (2022/1/28 22:11 [ykq11]);
** @param claims
* * @return java.lang.String
*/
private String generateToken(Map<String, Object> claims) {
return Jwts.builder().
setClaims(claims).
setExpiration(generateExpiration()).
compact();

}
/**
* Description : TODO 生成token失效时间 <br/>
* ChangeLog : 1. 创建 (2022/1/28 22:12 [ykq11]);
* *
* * @return java.util.Date
*/
private Date generateExpiration() {
return new Date(System.currentTimeMillis() + expiration * 1000);
}
/**
* Description : TODO 从token中获取用户名 <br/>
* ChangeLog : 1. 创建 (2022/1/28 22:17 [ykq11]);
** @param token
* * @return username
*/
public String getUsernameFromToken(String token){
String username;
try {
Claims clams=getClaimFromToken(token);
username=clams.getSubject();
} catch (Exception e) {
username = null;
}
return username;
}
/**
* Description : TODO 验证token是否有效<br/>
* ChangeLog : 1. 创建 (2022/1/28 22:28 [ykq11]);
** @param userDetails,token
* * @return null
*/
public boolean validateToken(String token, UserDetails userDetails) {
String username = getUsernameFromToken(token);
return username.equals(userDetails.getUsername())&& !isTokenExpired(token);
}
/**
* Description : TODO 判断token是否可以被刷新<br/>
* ChangeLog : 1. 创建 (2022/1/28 22:34 [ykq11]);
** @param token
* * @return null
*/
public boolean canRefresh(String token){
return !isTokenExpired(token);
}
/**
* Description : TODO 刷新token<br/>
* ChangeLog : 1. 创建 (2022/1/28 22:36 [ykq11]);
** @param token
* * @return null
*/
public String refreshToken(String token) {
Claims claims = getClaimFromToken(token);
claims.put(CLAIM_KEY_CREATED,new Date());
return generateToken(claims);
}
/**
* Description : TODO 判断token是否失效<br/>
* ChangeLog : 1. 创建 (2022/1/28 22:29 [ykq11]);
** @param token
* * @return null
*/
private boolean isTokenExpired(String token) {
Date expiredDate = getExpirationDateFromToken(token);
return expiredDate.before(new Date());
}
/**
* Description : TODO 获取token中的失效时间 <br/>
* ChangeLog : 1. 创建 (2022/1/28 22:32 [ykq11]);
** @param token
* * @return null
*/
private Date getExpirationDateFromToken(String token) {
Claims claims=getClaimFromToken(token);
return claims.getExpiration();
}

/**
* Description : TODO 从token获取荷载<br/>
* ChangeLog : 1. 创建 (2022/1/28 22:21 [ykq11]);
** @param token
* * @return Claims
*/
private Claims getClaimFromToken(String token) {
Claims claims=null;
try {
claims= Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
e.printStackTrace();
}
return claims;
}
}

JWT 工具类的编写的更多相关文章

  1. jwt工具类的封装

    第一步先引入jar: <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-j ...

  2. Java基础知识强化92:日期工具类的编写和测试案例

    1. DateUtil.java,代码如下: package cn.itcast_04; import java.text.ParseException; import java.text.Simpl ...

  3. 编写一个数组工具类, 编写本软件的 帮助文档(API文档)

    本文档是对静态成员的练习. 一. 建立一个ArrayTool(数组工具)的类,在此类中对传入数组进行一些操作(选最大值.先最小值.冒泡排正序.选择排反序.输出数组元素), 二. 建立一个Test的类, ...

  4. 记一次关于JDBCUtils工具类的编写

    jdbc.properties数据库配置的属性文件内容如下 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost/xxxx ...

  5. Bootstrap分页插件ajax返回数据,工具类的编写

    使用Bootstrap分页插件时,需要返回指定的参数,这样Bootstrap才能够识别 需要引入的css: <!-- boostrap table --> <link href=&q ...

  6. 02_c3p0之c3p0-config.xml配置案例,操作c3p0的jdbcUtil工具类的编写

     c3p0也是一个开源jdbc连接池,我们熟悉的Hibernate和Spring框架使用的都是该数据源. 这里获得数据源使用的方法是:ComboPooledDataSource 它提供的构造方法有 ...

  7. JWT工具类

    package com.ynhrm.common.utils; import io.jsonwebtoken.Claims;import io.jsonwebtoken.JwtBuilder;impo ...

  8. jwt 工具类

    public class TokenUtils { private Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 签名 ...

  9. JAVA结合 JSON Web Token(JWT) 工具类

    引入java-jwt-3.3.0.jar .  jjwt-0.9.0.jar .jackson-all-1.7.6.jar 或者maven <!-- https://mvnrepository. ...

  10. SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑

    (1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...

随机推荐

  1. Arm-Linux子系统的互相Notify

    前言: Linux下面不同的子系统一个个的组成了整个系统的运行环节,为了让这些子系统能够互相通讯,有一种叫做:notify chain(通知链)的东西.本篇看下. 概括 所谓通知链,有通知,就有执行的 ...

  2. Nginx01 简介和安装

    1 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler ...

  3. java_web案例文件下载案例

    目的:完成javaweb的文件下载 <!--如果想要一个a标签点击后不论文件类型,都需要弹出下载,保存框:--><!--我们就需要创建一个servlet,让这个a标签指向servle ...

  4. windows C++

    #include <Windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar ...

  5. 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介

    ️Reference: IoT 边缘计算系列文章 什么是边缘容器? 边缘容器的概念 边缘容器是分散的计算资源,尽可能靠近最终用户或设备,以减少延迟.节省带宽并增强整体数字体验. 可以访问互联网的设备数 ...

  6. JZOJ 2022.07.18【提高组A】模拟

    \(\text{T1}\) 很容易想到用 \(f_1 f_2 ... f_k\) 来表示第 \(n\) 项 发现重点关注指数即可,即我们要递推 \(f_1 ... f_k\) 对应的指数 递推涉及 \ ...

  7. GDOI2021游记

    \(\text{Day0}\) 4月9日抵达深圳耀华实验学校 宿舍在迷你公寓,竟然是女生公寓?!! 我想起了 \(b\) 站看到的一个 \(NOI\) 全国总决赛的纪录片(惊人的相似) 不过确实还行 ...

  8. 最大K段和

    题目大意 有一个长度为 \(N\) 的序列 \(A\) .他希望从中选出不超过 \(K\) 个连续子段,满足它们两两不相交,求总和的最大值(可以一段也不选,答案为 \(0\)). 分析 很容易想到 \ ...

  9. HACKNOS: RECONFORCE (V1.1)

    HACKNOS: RECONFORCE (V1.1) 目录 HACKNOS: RECONFORCE (V1.1) 1 信息收集 1.1 端口扫描 1.2 ftp分析 1.3 后台目录扫描 1.2.1 ...

  10. Vulhub 漏洞学习之:Couchdb

    Vulhub 漏洞学习之:Couchdb 目录 Vulhub 漏洞学习之:Couchdb 1 Couchdb 垂直权限绕过漏洞(CVE-2017-12635) 1.1 漏洞利用过程 2 Couchdb ...