<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-apiartifactId>
<version>0.11.2version>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-implartifactId>
<version>0.11.2version>
<scope>runtimescope>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-jacksonartifactId>
<version>0.11.2version>
<scope>runtimescope>
dependency>
package com.woniu.utils;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
//@Component
public class JwtUtils {
// @Value("{jwt.skin.key}")
//key的大小必须大于或等于256bit,需要32位英文字符,一个英文字符为:8bit,一个中文字符为12bit
private String key="ssssssssssdfdsafasfdssdfsfsfssfs";
//设置加密算法
private SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;
/**
* 获取转换后的私钥对象
* @return
*/
public SecretKey getSecretKey(){
return Keys.hmacShaKeyFor(key.getBytes());
}
/**
* 生成JWT
* @param exp 指定过期时间,不能小于当前时间
* @param payLoad 携带的数据
* @return
*/
public String createJwt(Date exp , Map<String,Object> payLoad){
return Jwts.builder()
.setClaims(payLoad)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setExpiration(exp)
.signWith(getSecretKey(),signatureAlgorithm)
.compact();
}
/**
* 解析JWS,返回一个布尔结果
* @param jwsString
* @return
*/
public Boolean parseJwt(String jwsString){
boolean result= false;
try {
Jwts.parserBuilder()
.setSigningKey(getSecretKey())
.build()
.parseClaimsJws(jwsString);
result=true;
}catch (JwtException e){
result=false;
}finally {
return result;
}
}
/**
* 解析Jws,返回一个Jws对象
* @param jwsString
* @return
*/
public Jws parseJwtResultJws(String jwsString){
Jws<Claims> claims=null;
try {
claims = Jwts.parserBuilder()
.setSigningKey(getSecretKey())
.build()
.parseClaimsJws(jwsString);
}catch (JwtException e){
e.printStackTrace();
}
return claims;
}
/**
* 获取header中的数据
* @param jwsString
* @return
*/
public Map<String,Object> getHeader(String jwsString){
return parseJwtResultJws(jwsString).getHeader();
}
/**
* 获取PayLoad中携带的数据
* @param jwsString
* @return
*/
public Map<String,Object> getPayLoad(String jwsString){
return ((Map<String, Object>) (parseJwtResultJws(jwsString)).getBody());
}
/**
* 获取除去exp和iat的数据,exp:过期时间,iat:JWT生成的时间
* @param jwsString
* @return
*/
public Map<String,Object> getPayLoadALSOExcludeExpAndIat(String jwsString){
Map<String, Object> map = getPayLoad(jwsString);
map.remove("exp");
map.remove("iat");
return map;
}
public static void main(String[] args) {
JwtUtils jwtUtils = new JwtUtils();
Date exp = new Date(System.currentTimeMillis()+60*60*24);
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("name","张三");
String jwt = jwtUtils.createJwt(exp, hashMap);
System.out.println(jwt);
System.out.println(jwtUtils.getPayLoadALSOExcludeExpAndIat(jwt));
}
}
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.60version>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-apiartifactId>
<version>0.11.2version>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-implartifactId>
<version>0.11.2version>
<scope>runtimescope>
dependency>
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwt-jacksonartifactId>
<version>0.11.2version>
<scope>runtimescope>
dependency>
package com.woniu.utils;
import com.alibaba.fastjson.JSON;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
//@Component
public class JwtUtils {
//@Value("{jwt.skin.key}")
//key的大小必须大于或等于256bit,需要32位英文字符,一个英文字符为:8bit,一个中文字符为12bit
private String key="ssssssssssdfdsafasfdssdfsfsfssfs";
//设置加密算法
private SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;
//获取header中的数据
private final Integer GET_HEADER_DATA =0;
//获取payload中的数据
private final Integer GET_PAYLOAD_DATA =1;
/**
* 获取转换后的私钥对象
* @return
*/
public SecretKey getSecretKey(){
return Keys.hmacShaKeyFor(key.getBytes());
}
/**
* 生成JWT
* @param exp 指定过期时间,不能小于当前时间
* @param payLoad 携带的数据
* @return
*/
public String createJwt(Date exp , Map<String,Object> payLoad){
return Jwts.builder()
.setClaims(payLoad)//设置携带参数
.setIssuedAt(new Date(System.currentTimeMillis()))//创建时间
.setExpiration(exp)//过期时间
.signWith(getSecretKey(),signatureAlgorithm)//设置加密算法和私钥
.compact();
}
/**
* 解析JWS,返回一个布尔结果
* @param jwsString
* @return
*/
public Boolean parseJwt(String jwsString){
boolean result= false;
try {
Jwts.parserBuilder()
.setSigningKey(getSecretKey())//设置私钥
.build()
.parseClaimsJws(jwsString);//要解析的jws
result=true;
}catch (JwtException e){
e.getMessage();
}
return result;
}
public String getJson(String jwsString,Integer code){
//判断解析结果如果失败返回空,如果有全局异常处理,此处可抛自定义异常进行处理
if(!parseJwt(jwsString)) return null;
//将jws中的数据编码串截取出来使用Base64解析成字节数组
byte[] decodePayLoad = Base64Utils.decodeFromString(jwsString.split("\\.")[code]);
return new String(decodePayLoad);
}
public Map<String,Object> getData(String jwsString,Integer code){
//此处使用的阿里的fastJson,可使用其他的工具将字节json字节转map
return JSON.parseObject(getJson(jwsString,code),Map.class);
}
/**
* 获取header中的数据
* @param jwsString
* @return
*/
public Map<String,Object> getHeader(String jwsString){
return getData(jwsString,GET_HEADER_DATA);
}
/**
* 获取PayLoad中携带的数据
* @param jwsString
* @return
*/
public Map<String,Object> getPayLoad(String jwsString){
return getData(jwsString,GET_PAYLOAD_DATA);
}
/**
* 获取除去exp和iat的数据,exp:过期时间,iat:JWT生成的时间
* @param jwsString
* @return
*/
public Map<String,Object> getPayLoadALSOExcludeExpAndIat(String jwsString){
Map<String, Object> map = getData(jwsString, GET_PAYLOAD_DATA);
map.remove("exp");
map.remove("iat");
return map;
}
/**
* 测试
* @param args
*/
public static void main(String[] args) {
//创建一个过期时间
Date date = new Date(System.currentTimeMillis()+60*60*24);
//设置要携带的数据
Map<String,Object> map = new HashMap<>();
map.put("name","张三");
//创建工具类对象
JwtUtils jwtUtils = new JwtUtils();
String jwt = jwtUtils.createJwt(date, map);
System.out.println(jwt);
jwtUtils.parseJwt(jwt);
System.out.println(jwtUtils.getPayLoad(jwt));
}
}
jwt官网:https://jwt.io
源码:https://github.com/jwtk/jjwt#install-jdk