- jwt-token是前后端分离架构中常用的用户校验方案,和session不同,它是无状态的。
- 推荐官网去看看:https://jwt.io/
- 好了,接下来是一些关键代码示例
maven依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
生成token的工具类
public class JwtTokenProvider {
SecretKeySpec key;
/**
* @param key
* 密钥(例如:12345678)
*/
public JwtTokenProvider(String key) {
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), SignatureAlgorithm.HS512.getJcaName());
this.key = secretKeySpec;
}
/**
* 生成token
*
* @return
*/
public String createToken(Claims claims) {
String compactJws = Jwts.builder().setPayload(JSONObject.toJSONString(claims))
.compressWith(CompressionCodecs.DEFLATE).signWith(SignatureAlgorithm.HS512, key).compact();
return compactJws;
}
/** token转换为 */
public Claims parseToken(String token) {
try {
return Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
封装后的token信息对象userClaims
/**
* 权限信息对象
* @author Tony
*
*/
public class UserClaims extends JwtMap implements Claims {
private String[] scope;
private String grantType = "password";
private String userName; // 用户名
private String email; // 邮箱
private String phone; // 电话号码
public String[] getScope() {
return scope;
}
public void setScope(String[] scope) {
this.scope = scope;
setValue("scope", this.scope);
}
public String getGrantType() {
return grantType;
}
public void setGrantType(String grantType) {
this.grantType = grantType;
setValue("grantType", this.grantType);
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
setValue("userName", this.userName);
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
setValue("email", this.email);
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
setValue("phone", this.phone);
}
@Override
public String getIssuer() {
return getString(ISSUER);
}
@Override
public Claims setIssuer(String iss) {
setValue(ISSUER, iss);
return this;
}
@Override
public String getSubject() {
return getString(SUBJECT);
}
@Override
public Claims setSubject(String sub) {
setValue(SUBJECT, sub);
return this;
}
@Override
public String getAudience() {
return getString(AUDIENCE);
}
@Override
public Claims setAudience(String aud) {
setValue(AUDIENCE, aud);
return this;
}
@Override
public Date getExpiration() {
return get(Claims.EXPIRATION, Date.class);
}
@Override
public Claims setExpiration(Date exp) {
setDate(Claims.EXPIRATION, exp);
return this;
}
@Override
public Date getNotBefore() {
return get(Claims.NOT_BEFORE, Date.class);
}
@Override
public Claims setNotBefore(Date nbf) {
setDate(Claims.NOT_BEFORE, nbf);
return this;
}
@Override
public Date getIssuedAt() {
return get(Claims.ISSUED_AT, Date.class);
}
@Override
public Claims setIssuedAt(Date iat) {
setDate(Claims.ISSUED_AT, iat);
return this;
}
@Override
public String getId() {
return getString(ID);
}
@Override
public Claims setId(String jti) {
setValue(Claims.ID, jti);
return this;
}
@Override
public <T> T get(String claimName, Class<T> requiredType) {
Object value = get(claimName);
if (value == null) {
return null;
}
if (Claims.EXPIRATION.equals(claimName)
|| Claims.ISSUED_AT.equals(claimName)
|| Claims.NOT_BEFORE.equals(claimName)) {
value = getDate(claimName);
}
if (requiredType == Date.class && value instanceof Long) {
value = new Date((Long) value);
}
if (!requiredType.isInstance(value)) {
throw new RequiredTypeException("Expected value to be of type: "
+ requiredType + ", but was " + value.getClass());
}
return requiredType.cast(value);
}
}
JWTtests 测试代码
/**
* JWT-Token生成
*
* @author Tony
*
*/
public class JWTtests {
public static void main(String[] args) {
// md5("7981798723412342134"); > 签名
// 密钥 12345678
JwtTokenProvider jwtTokenProvider = new JwtTokenProvider("12345678");
UserClaims claims = new UserClaims();
claims.setUserName("Tony");
claims.setEmail("[email protected]");
// token有效期
String token = jwtTokenProvider.createToken(claims);
System.out.println("生成的token:" + token);
// 生成Token
Claims userClaims = jwtTokenProvider.parseToken(token);
System.out.println("解析出来的Toekn内容:" + userClaims);
System.out.println("动脑学院两周年,现在报名,给你想不到的优惠");
}
}