what is jwt? json web token,主要是用来做认证的,因为他是基于数字签名的 ,所以安全性贼高,是一种协议,本身是json格式,支持跨语言,同时它由三部分组成header(用于说明加密算法和说明是jwt),playload(传输用户需要携带的脱敏业务信息),signature(用来对前两部分进行签名认证的,防止篡改),由于jwt使用使用base64进行对称加密,所以不要传输任何敏感信息,因为这个相当于明文,但是客户端在不知道签名使用的加密盐情况下又是无法修改其信息,所以做到了,相对安全认证,而且不需要使用客户端cookie,所以可以防止csrf java中怎么开发 当我们知道了他的原理后,其实它的开发就很简单了,只要组装好它规定的字段就可以了,我们一般使用jjwt这个jar包,用户可以去maven仓库下载。 操作主要使用JwtBuilder接口,使用Jwts.builder来生成一个DefaultJwtBuilder实例,而它又实现了JwtBuilder接口,所以有下面的方法。 当前台将这个token发送给后台时,我们需要使用下面的方法解析 下面提供一个java工具类其中 DateHandle.timeDifference就是一个时间差工具,自己计算下就行
public class TokenHandle {
private static final String SALT = "xxxxx";
/**
* 登录生成token
* @param claims
* @return
*/
public static String generateToken(Claims claims){
return generateToken(claims, -1);
}
/**
* 登录生成token
* @param claims
* @param exp 有效期
* @return
*/
public static String generateToken(Claims claims, Integer exp){
JwtBuilder jwtBuilder = Jwts.builder();
claims.setId(UUID.randomUUID().toString());
claims.setIssuedAt(new Date());
claims.setSubject("用户信息");
jwtBuilder.setClaims(claims);
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
jwtBuilder.signWith(signatureAlgorithm,SALT);
if(exp != null && exp > 0){
jwtBuilder.setExpiration(new Date(System.currentTimeMillis()+exp));
}
return jwtBuilder.compact();
}
/**
* 解析获取的token字符串
* @param token
* @return
*/
public static Claims parseToken(String token){
Claims claims;
try {
claims = Jwts.parser().setSigningKey(SALT)
.parseClaimsJws(token)
.getBody();
} catch (ExpiredJwtException | UnsupportedJwtException | MalformedJwtException | SignatureException | IllegalArgumentException e) {
return null;
}
return claims;
}
/**
* 判断是否需要刷新token
* @param claims
* @return
*/
public static Boolean needRefreshToken(Claims claims){
Date expirationDate = claims.getExpiration();
if(EmptyUtil.isEmpty(expirationDate)){
return false;
}
Long validityPeriod = DateHandle.timeDifference(claims.getExpiration(), claims.getIssuedAt());
Long differenceTime = DateHandle.timeDifference(new Date(), claims.getExpiration());
return differenceTime > validityPeriod/2;
}
/**
* 刷新token
* @param claims
* @return
*/
public static String refreshToken(Claims claims){
JwtBuilder jwtBuilder = Jwts.builder();
Long validityPeriod = DateHandle.timeDifference(claims.getExpiration(), claims.getIssuedAt());
claims.setIssuedAt(new Date());
jwtBuilder.setClaims(claims);
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
jwtBuilder.signWith(signatureAlgorithm,SALT);
jwtBuilder.setExpiration(new Date(System.currentTimeMillis()+validityPeriod));
return jwtBuilder.compact();
}
}