当前位置:网站首页>jjwt 生成token
jjwt 生成token
2022-07-27 06:07:00 【qq_34135615】
实现原理

导入maven依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
创建实体对象
package com.wl.study.utils;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SessionInfo {
private Long userId;
private String userName;
private String token;
}
创建token生成与解析
package com.wl.study.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.CompressionCodecs;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.lang3.StringUtils;
import java.text.MessageFormat;
import java.util.Optional;
public class JwtUtil {
/*** * 生成token * @param sessionInfo * @return */
public static Optional<String> generateToken(SessionInfo sessionInfo){
String token = Jwts.builder()
//主题
.setSubject(JwtConfig.JWT_SUBJECT)
//自定义属性
.claim(JwtConfig.JWT_USERID, sessionInfo.getUserId())
.claim(JwtConfig.JWT_USERNAME, sessionInfo.getUserName())
// 压缩
.compressWith(CompressionCodecs.DEFLATE)
// 签名
.signWith(SignatureAlgorithm.HS512, JwtConfig.JWT_SIGNING_KEY)
.compact();
return Optional.of(MessageFormat.format("{0}{1}",JwtConfig.JWT_TOKEN_PREFIX,token));
}
/*** * 解析token * @param token * @return */
public static Optional<SessionInfo> parserToken(String token){
if(StringUtils.isEmpty(token)){
return Optional.empty();
}
Claims claims = Jwts.parser()
.setSigningKey(JwtConfig.JWT_SIGNING_KEY)
.parseClaimsJws(token.replace(JwtConfig.JWT_TOKEN_PREFIX, ""))
.getBody();
SessionInfo sessionInfo = SessionInfo.builder().token(token).build();
if(claims.containsKey(JwtConfig.JWT_USERID)){
sessionInfo.setUserId( Long.valueOf(claims.get(JwtConfig.JWT_USERID).toString()));
}
if(claims.containsKey(JwtConfig.JWT_USERNAME)){
sessionInfo.setUserName( claims.get(JwtConfig.JWT_USERNAME).toString());
}
return Optional.of(sessionInfo);
}
private static class JwtConfig{
private final static String JWT_SUBJECT ="integral";
private final static String JWT_USERID ="userId";
private final static String JWT_USERNAME ="userName";
/*** * 密钥 */
private final static String JWT_SIGNING_KEY = "[email protected]!&key^#";
/** * jwt的前缀 */
public static final String JWT_TOKEN_PREFIX = "Bearer ";
}
public static void main(String[] args) {
SessionInfo sessionInfo = new SessionInfo();
sessionInfo.setUserId(1L);
sessionInfo.setUserName("张飞");
Optional<String> optional = JwtUtil.generateToken(sessionInfo);
System.out.println(MessageFormat.format("{0}:{1}","生成token",optional.orElse(null)));
System.out.println(MessageFormat.format("{0}:{1}","解析token",JwtUtil.parserToken(optional.get())));
}
}
创建token工具类
package com.wl.study.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.CompressionCodecs;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.lang3.StringUtils;
import java.text.MessageFormat;
import java.util.Optional;
public class JwtUtil {
/*** * 生成token * @param sessionInfo * @return */
public static Optional<String> generateToken(SessionInfo sessionInfo){
String token = Jwts.builder()
//主题
.setSubject(JwtConfig.JWT_SUBJECT)
//自定义属性
.claim(JwtConfig.JWT_USERID, sessionInfo.getUserId())
.claim(JwtConfig.JWT_USERNAME, sessionInfo.getUserName())
// 压缩
.compressWith(CompressionCodecs.DEFLATE)
// 签名
.signWith(SignatureAlgorithm.HS512, JwtConfig.JWT_SIGNING_KEY)
.compact();
return Optional.of(MessageFormat.format("{0}{1}",JwtConfig.JWT_TOKEN_PREFIX,token));
}
/*** * 解析token * @param token * @return */
public static Optional<SessionInfo> parserToken(String token){
if(StringUtils.isEmpty(token)){
return Optional.empty();
}
Claims claims = Jwts.parser()
.setSigningKey(JwtConfig.JWT_SIGNING_KEY)
.parseClaimsJws(token.replace(JwtConfig.JWT_TOKEN_PREFIX, ""))
.getBody();
SessionInfo sessionInfo = SessionInfo.builder().token(token).build();
if(claims.containsKey(JwtConfig.JWT_USERID)){
sessionInfo.setUserId( Long.valueOf(claims.get(JwtConfig.JWT_USERID).toString()));
}
if(claims.containsKey(JwtConfig.JWT_USERNAME)){
sessionInfo.setUserName( claims.get(JwtConfig.JWT_USERNAME).toString());
}
return Optional.of(sessionInfo);
}
private static class JwtConfig{
private final static String JWT_SUBJECT ="integral";
private final static String JWT_USERID ="userId";
private final static String JWT_USERNAME ="userName";
/*** * 密钥 */
private final static String JWT_SIGNING_KEY = "[email protected]!&key^#";
/** * jwt的前缀 */
public static final String JWT_TOKEN_PREFIX = "Bearer ";
}
public static void main(String[] args) {
SessionInfo sessionInfo = new SessionInfo();
sessionInfo.setUserId(1L);
sessionInfo.setUserName("张飞");
Optional<String> optional = JwtUtil.generateToken(sessionInfo);
System.out.println(MessageFormat.format("{0}:{1}","生成token",optional.orElse(null)));
System.out.println(MessageFormat.format("{0}:{1}","解析token",JwtUtil.parserToken(optional.get())));
}
}
边栏推荐
- Livox SLAM(带LIO+闭环检测优化)
- 李沐动手学深度学习V2-transformer和代码实现
- Misunderstanding of slice slice in golang
- Watermelon book chapter 3 - linear model learning notes
- AI: play games in your spare time - earn it a small goal - [Alibaba security × ICDM 2022] large scale e-commerce map of risk commodity inspection competition
- 【QT】capture.obj:-1: error: LNK2019: 无法解析的外部符号 __imp_htons(解决方法)
- 如何借助自动化工具落地DevOps|含低代码与DevOps应用实践
- Drools(5):Drools基础语法(3)
- Interpretation of deepsort source code (III)
- Brief introduction of simulation model
猜你喜欢

Music website management system based on SSM

Vscode connection remote server development

Pan Aimin, chairman of instruction set, attended the 2022 ecug con to speak for China's technical forces

Generics -- learn it, and there are many benefits

使用pip命令切换不同的镜像源

Shell programming specifications and variables

How to implement Devops with automation tools | including low code and Devops application practice

Analysis on the current situation and optimization strategy of customer experience management in banking industry

Summary of APP launch in vivo application market

(posted) comparison of Eureka, consumer and Nacos 2
随机推荐
py2exe qt界面风格变成了win98解决方案
请问有人使用oracle xstream 时出现个别capture延迟很大的吗,该如何解决延迟问题呢
大疆livox定制的格式CustomMsg格式转换pointcloud2
OpenGL development with QT (I) drawing plane graphics
36 - 新的 Promise 方法:allSettled & any & race
Interpretation of deepsort source code (IV)
Vscode creates golang development environment and debug unit test of golang
sql-labs SQL注入平台-第1关Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入)
【golang学习笔记2.1】 golang中的数组中的排序和查找
TS learning (VIII): classes in TS
Binary tree -- natural search semantics (1) Basics
What is OKR and what is the difference between OKR and KPI
Datascience: data generation adds a small amount of noise (customizable noise) to the original data to realize the construction of new data (dataframe format data storage case)
MySQL index failure and solution practice
36 - new promise method: allsettled & any & race
(转帖)eureka、consul、nacos的对比1
一款开源 OA 办公自动化系统
使用pip命令切换不同的镜像源
Dajiang livox customized format custommsg format conversion pointcloud2
pre-commit install 时 CalledProcessError