/**
|
* Copyright 2018-2020 stylefeng & fengshuonan (sn93@qq.com)
|
* <p>
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
* <p>
|
* http://www.apache.org/licenses/LICENSE-2.0
|
* <p>
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
*/
|
package com.doumee.config.Jwt;
|
|
|
import io.jsonwebtoken.*;
|
import org.apache.commons.lang3.StringUtils;
|
|
import java.util.Date;
|
import java.util.Map;
|
|
/**
|
* <p>后台系统jwt token工具类</p>
|
* <pre>
|
* jwt的claim里一般包含以下几种数据:
|
* 1. iss -- token的发行者
|
* 2. sub -- 该JWT所面向的用户
|
* 3. aud -- 接收该JWT的一方
|
* 4. exp -- token的失效时间
|
* 5. nbf -- 在此时间段之前,不会被处理
|
* 6. iat -- jwt发布时间
|
* 7. jti -- jwt唯一标识,防止重复使用
|
* </pre>
|
*
|
* @author fengshuonan
|
* @Date 2017/8/25 10:59
|
*/
|
public class JwtTokenUtil {
|
//Header 名称
|
public static final String HEADER_KEY = "token";
|
//取值名称
|
public static final String UserId_Name = "AppUserId";
|
//取值名称
|
public static final String MEMBER = "MEMBER";
|
//加密密钥
|
private final static String jwtSecret = "MhAjU9poLf8ko54K25XBDtonaL33vtt1";
|
//过期时间(s) 86400L=1天 604800L=7天
|
private static final long expire = 86400L;
|
|
/**
|
* 生成token,根据userId和默认过期时间
|
*/
|
public static String generateToken(JwtPayLoad jwtPayLoad) {
|
Long expiredSeconds = getExpireSeconds();
|
final Date expirationDate = new Date(System.currentTimeMillis() + expiredSeconds * 1000);
|
return generateToken(jwtPayLoad.getMemberId(), expirationDate, jwtPayLoad.toMap());
|
}
|
|
/**
|
* 验证token是否失效
|
*/
|
public static Boolean isTokenExpired(String token) {
|
try {
|
final Date expiration = getExpirationDateFromToken(token);
|
return expiration.before(new Date());
|
} catch (ExpiredJwtException expiredJwtException) {
|
return true;
|
}
|
}
|
|
/**
|
* 生成token,根据userId和默认过期时间
|
*/
|
public static String generateTokenOld(JwtPayLoad jwtPayLoad) {
|
Long expiredSeconds = getExpireSeconds();
|
final Date expirationDate = new Date(System.currentTimeMillis() + expiredSeconds * 1000);
|
return generateToken(jwtPayLoad.getMemberId(), expirationDate, jwtPayLoad.toMap());
|
}
|
|
/**
|
* 获取jwt的payload部分
|
*/
|
public static JwtPayLoad getJwtPayLoad(String token) {
|
Claims claimFromToken = getClaimFromToken(token);
|
return JwtPayLoad.toBean(claimFromToken);
|
}
|
|
/**
|
* 解析token是否正确(true-正确, false-错误)
|
*/
|
public static Boolean checkToken(String token) {
|
try {
|
String jwtSecret = getJwtSecret();
|
Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody();
|
return true;
|
} catch (JwtException e) {
|
return false;
|
}
|
}
|
|
/**
|
* 验证token是否失效
|
*/
|
public static Boolean isTokenExpiredOld(String token) {
|
try {
|
final Date expiration = getExpirationDateFromToken(token);
|
return expiration.before(new Date());
|
} catch (ExpiredJwtException expiredJwtException) {
|
return true;
|
}
|
}
|
|
// 从token中获取用户ID
|
public static String getUserId(String token){
|
return getClaimFromToken(token).getSubject();
|
}
|
|
/**
|
* 获取jwt失效时间
|
*/
|
public static Date getExpirationDateFromToken(String token) {
|
return getClaimFromToken(token).getExpiration();
|
}
|
|
/**
|
* 生成token,根据userId和过期时间
|
*/
|
public static String generateToken(String userId, Date exppiredDate, Map<String, Object> claims) {
|
|
final Date createdDate = new Date();
|
String secret = getJwtSecret();
|
|
if (claims == null) {
|
return Jwts.builder()
|
.setSubject(userId.toString())
|
.setIssuedAt(createdDate)
|
.setExpiration(exppiredDate)
|
.signWith(SignatureAlgorithm.HS512, secret)
|
.compact();
|
} else {
|
return Jwts.builder()
|
.setClaims(claims)
|
.setSubject(userId.toString())
|
.setIssuedAt(createdDate)
|
.setExpiration(exppiredDate)
|
.signWith(SignatureAlgorithm.HS512, secret)
|
.compact();
|
}
|
}
|
|
/**
|
* 获取jwt的payload部分
|
*/
|
public static Claims getClaimFromToken(String token) {
|
if (StringUtils.isBlank(token)) {
|
throw new IllegalArgumentException("token参数为空!");
|
}
|
String jwtSecret = getJwtSecret();
|
return Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody();
|
}
|
|
/**
|
* 获取系统地密钥
|
*/
|
private static String getJwtSecret() {
|
return jwtSecret;
|
}
|
|
/**
|
* 获取系统地密钥过期时间(单位:秒)
|
*/
|
private static Long getExpireSeconds() {
|
return expire;
|
}
|
}
|