packagecom.fh.util;import io.jsonwebtoken.*;importorg.codehaus.jackson.map.ObjectMapper;importjavax.crypto.SecretKey;importjavax.crypto.spec.SecretKeySpec;importjavax.servlet.http.HttpServletRequest;importjava.util.Date;importjava.util.UUID;public classJWTUtils {//服务器的kye.用户做加解密的key数据。
private static final String JWT_SECERT="jwt_secert";private static final ObjectMapper MAPPER=newObjectMapper();public staticSecretKey generalKey(){try{byte[] encodedKey=JWT_SECERT.getBytes("UTF-8");
SecretKey key=new SecretKeySpec(encodedKey,0,encodedKey.length,"AES");returnkey;
}catch(Exception e){
e.printStackTrace();
}return null;
}/*** 签发JWT,创建token的方法
*@paramid jwt的唯一标识,主要用来做一次性token。
*@paramiss jwt签发者
*@paramsubject jwt所面向的用户。一般使用用户的登录名
*@paramttlMillis 有效期,单位毫秒
*@returntoken 是为一个用户的有效登录周期准备的一个tkoen 。用户推出或超时,token失效*/
public static String createJWT(String id,String iss,String subject,longttlMillis){try{
SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;long nowMilllis =System.currentTimeMillis();
Date now=newDate(nowMilllis);
SecretKey secretKey=generalKey();
JwtBuilder builder=Jwts.builder()
.setId(id)
.setIssuer(iss)
.setSubject(subject)
.setIssuedAt(now)//token生成时间
.signWith(signatureAlgorithm,secretKey);//设置密匙和算法
if (ttlMillis>0){long expMillis=nowMilllis+ttlMillis;
Date expDate=newDate(expMillis);
builder.setExpiration(expDate);
}returnbuilder.compact();
}catch(Exception e){
e.printStackTrace();
}return null;
}/*** 解析JWT字符串
*@paramjwt 就是生成的toekn
*@return
*/
public staticClaims parseJWT(String jwt){
SecretKey secretKey=generalKey();returnJwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)
.getBody();
}/*** 验证jwt
*@paramjwtStr
*@return
*/
public staticString validateJWT(String jwtStr){
Claims claims=null;try{
claims=parseJWT(jwtStr);//成功
}catch(ExpiredJwtException e){//token过期
e.printStackTrace();
}catch(SignatureException e){//签名错误
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}return null;
}public staticString generalSubject(Object subject){try{returnMAPPER.writeValueAsString(subject);
}catch(Exception e){
e.printStackTrace();
}return null;
}/*** 使用 ——— 生成token*/
public voidlogin(){//生成
String jwtToken=JWTUtils.createJWT(UUID.randomUUID().toString(),"test-jwt",JWTUtils.generalSubject(user.getUsername),1*60*1000);
}/*** 获取接口放在header中的token
*@paramrequest*/
public voidtest(HttpServletRequest request){
String token=request.getHeader("Authorization");//生成的token
String result=JWTUtils.validateJWT(token);//验证
}
}