背景说明
一个大的项目拆分成了几个子系统,系统之间进行交互,传输时为保证安全性,需要先认证后业务处理,这里选择token,使用jwt生成。
交互逻辑:子系统A(编号+秘钥)—-> 发起请求 —-> 子系统B(编号+秘钥),编号和秘钥统一配置。
代码实现
工具类
<!-- JWT-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java .util.Date;
public class JjwtTransferUtils {
/**
* @param subjectCode
* @param secretKey
* @param expireTime
* @return
*/ public static String generateToken(String subjectCode, String secretKey, long expireTime) {
String JwtToken = Jwts.builder()
.setSubject(subjectCode)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + expireTime))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
return JwtToken;
}
/**
* @param secretKey
* @param token
* @return
*/ public static Jws<Claims> parseToken(String secretKey, String token) {
Jws<Claims> claimsJws = null;
try {
claimsJws = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
} catch ( Exception e) {
e.printStackTrace();
}
return claimsJws;
}
/**
* @param subjectCode
* @param secretKey
* @param token
* @return
*/ public static boolean verifyToken(String subjectCode, String secretKey, String token) {
if (subjectCode == null || "".equals(subjectCode)) {
return false;
}
if (secretKey == null || "".equals(secretKey)) {
return false;
}
if (token == null || "".equals(token)) {
return false;
}
Jws<Claims> claimsJws = parseToken(secretKey, token);
if (claimsJws == null) {
return false;
}
if (subjectCode.equals(claimsJws.getBody().getIssuer())) {
return true;
}
return true;
}
}
测试类
public class JjwtTransferDemo {
public static void main(String[] args) {
String code = "ltxvNVaQ1uO7dt3W2Y1Q";
String secret = "CNX3JobPVhNtClrVhzu";
long expireTime = 60 * 60 * 1000;
// 生成token
String token = JjwtTransferUtils.generateToken(code, secret, expireTime);
System.out.println("token=" + token);
// 验证token
boolean result = JjwtTransferUtils.verifyToken(code, secret, token);
System.out.println("result=" + result);
}
}