jwt和jjwt的区别
JWTs是JSON对象的编码表示。JSON对象由零或多个名称/值对组成,其中名称为字符串,值为任意JSON值。
JWT有助于在clear(例如在URL中)发送这样的信息,可以被信任为不可读(即加密的)、不可修改的(即签名)和URL - safe(即Base64编码的)。
JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。
- JJWT的目标是最容易使用和理解用于在JVM上创建和验证JSON Web令牌(JWTs)的库。
- JJWT是基于JWT、JWS、JWE、JWK和JWA RFC规范的Java实现。
- JJWT还添加了一些不属于规范的便利扩展,比如JWT压缩和索赔强制。
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @author syh
* @date 2022-10-30 14:39
* JWT工具类
*/
public class JwtUtil {
/**
* 过期时间2小时,单位毫秒
*/
public static final long EXPIRE = 1000 * 60 * 60 * 2;
/*
* 秘钥
* */
public static final String SECRET = "ukc8BDbRi111gUDaY6pZFfWus2jZWLPHO";
/**
* 生成token字符串的方法
*
* @param userName 用户名称
* @param userId 用户id
* @return token字符串
*/
public static String getJwtToken(String userName, String userId) {
return Jwts.builder()
//JWT头信息
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS2256")
//设置分类;设置过期时间 一个当前时间,一个加上设置的过期时间常量
.setSubject("lin-user")
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
//设置token主体信息,存储用户信息
.claim("username", userName)
.claim("userId", userId)
//.signWith(SignatureAlgorithm.ES256, SECRET)
.signWith(SignatureAlgorithm.HS256, SECRET)
.compact();
}
/**
* 判断token是否存在与有效
*
* @param jwtToken token串
* @return 验证结果
*/
public static boolean checkToken(String jwtToken) {
if (StringUtils.isBlank(jwtToken)) {
return false;
}
try {
//验证token
Jwts.parser().setSigningKey(SECRET).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 判断token是否存在与有效
*
* @param request request
* @return 验证结果
*/
public static boolean checkToken(HttpServletRequest request) {
try {
String token = request.getHeader("token");
if (StringUtils.isBlank(token)) {
return false;
}
Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 解密token
*
* @param request request
* @return 解密结果map
*/
public static Map<String, String> getMemberIdByJwtToken(HttpServletRequest request) {
String token = request.getHeader("token");
return decode(token);
}
/**
* 解密token
*
* @param token token字符串
* @return 解密结果map
*/
public static Map<String, String> getMemberIdByJwtToken(String token) {
return decode(token);
}
public static Map<String, String> decode(String token) {
// 封装解密结果
Map<String, String> map = new HashMap<>();
if (StringUtils.isEmpty(token)) {
return map;
}
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
Claims body = claimsJws.getBody();
String userName = (String) body.get("username");
String userId = (String) body.get("userId");
if (StringUtils.isBlank(userName)) {
userName = "";
}
if (StringUtils.isBlank(userId)) {
userId = "";
}
map.put("username", userName);
map.put("userId", userId);
return map;
}
}