首先是坐标
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.15.0</version>
</dependency>
然后工具类
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.stereotype.Component;
import org.apache.commons.lang.StringUtils;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Component
public class JwtUtils {
private static String secret = "secret key";
private static long expire = 1*24*60*60;
public static String objToStrTrim(Object obj) {
return obj == null ? "" : obj.toString().trim();
}
/**
* 生成jwt token
*/
public static String generateToken(Map<String, Object> userInfo) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("openId", userInfo.get("openId"));
map.put("sessionKey", userInfo.get("sessionKey"));
String subject = objToStrTrim(userInfo.get("userId"));
return baseToken(map,subject,expire);
}
/**
* 生成jwt token 临时
*/
public static String generateToken_h5(Map<String, Object> userInfo) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("userId", userInfo.get("userId"));
String subject = objToStrTrim(userInfo.get("userId"));
return baseToken(map,subject,60*60*1);
}
/**
* 解析临时token
* @return true:过期
*/
public static Map<String, String> parserToken_h5(String token) throws Exception{
// 解密token
Claims claims = JwtUtils.getClaimByToken(token);
if(claims == null) {
return null;
}
Map<String, String> map = new HashMap<String, String>();
map.put("userId", (String)claims.get("userId"));
return map;
}
/**
* 生成jwt token
*/
public static String baseToken(HashMap<String, Object> map,String subject,long expire_ms) {
Date nowDate = new Date();
return Jwts.builder()
.setHeaderParam("typ", "JWT")
.addClaims(map)
.setSubject(subject)
.setIssuedAt(nowDate)
.setExpiration(new Date(nowDate.getTime() + expire_ms * 1000))
.signWith(io.jsonwebtoken.SignatureAlgorithm.HS512, secret)
.compact();
}
public static Claims getClaimByToken(String token) {
try {
return Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
}catch (Exception e){
return null;
}
}
/**
* token是否过期
* @return true:过期
*/
public static boolean isTokenExpired(Claims claims) {
Date expiration = claims.getExpiration();
return expiration.before(new Date());
}
/**
* 校验token是否合法
* @return true:过期
*/
public static void validateToken(String requestUserId, Claims claims) throws Exception {
if(StringUtils.isBlank(requestUserId) || claims == null || StringUtils.isBlank(claims.getSubject())) {
throw new Exception("用户未登录");
}
String userId = claims.getSubject();
// 用户Id一致校验
if(!userId.equals(requestUserId)) {
throw new Exception("用户未登录");
}
// token过期
if(isTokenExpired(claims)) {
throw new Exception("登录状态过期");
}
}
/**
* 解析sessionInfo
* @return true:过期
*/
public static Map<String, String> parseMappSessionInfo(String token) {
// 解密token
Claims claims = JwtUtils.getClaimByToken(token);
if(claims == null) {
return null;
}
Map<String, String> sessionInfo = new HashMap<String, String>();
sessionInfo.put("openId", (String)claims.get("openId"));
sessionInfo.put("sessionKey", (String)claims.get("sessionKey"));
return sessionInfo;
}
/**
* 解析userInfo
* @return true:过期
*/
public static Map<String, Object> parseUserInfo(String requestUserId, String token) throws Exception {
// 解密token
Claims claims = JwtUtils.getClaimByToken(token);
if(claims == null) {
return null;
}
// 校验用户Token
validateToken(requestUserId, claims);
Map<String, Object> userInfo = new HashMap<String, Object>();
userInfo.put("userId", claims.getSubject());
userInfo.put("openId", claims.get("openId"));
userInfo.put("sessionKey", claims.get("sessionKey"));
return userInfo;
}
}
使用
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("openId", "openId");
dataMap.put("sessionKey", "sessionKey");
dataMap.put("userId", "userId");
String token = JwtUtils.generateToken(dataMap);
System.out.println(token);
输出:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzZXNzaW9uS2V5Ijoic2Vzc2lvbktleSIsIm9wZW5JZCI6Im9wZW5JZCIsInN1YiI6InVzZXJJZCIsImlhdCI6MTYxODI4MjA1NSwiZXhwIjoxNjE4MzY4NDU1fQ.vO6P52tb_tIR8F8jlfDg3SiN6dI_XOtOHvYmWxYQguXG5nosjfz5Lkn50DQXOKHPoF30tD4K2VParLZke-KnDw