一、maven坐标
<!-- JWT依赖 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.4.0</version>
</dependency>
二、配置项
在application.yml文件中添加
config:
jwt:
# 加密密钥
secret: 自己生成
# token有效时长,单位秒
expire: 3600
三、配置文件
/**
* JWT的token,区分大小写
*/
@ConfigurationProperties(prefix = "config.jwt")
@Component
@Setter
@Getter
public class JwtConfig {
private String secret;
private long expire;
/**
* 生成token
*
* @param subject
* @return
*/
public String createToken(String subject) {
Date nowDate = new Date();
Date expireDate = new Date(nowDate.getTime() + expire * 1000);// 过期时间
return Jwts.builder().setHeaderParam("typ", "JWT").setSubject(subject).setIssuedAt(nowDate)
.setExpiration(expireDate).signWith(SignatureAlgorithm.HS512, secret).compact();
}
/**
* 获取token中注册信息
*
* @param token
* @return
*/
public Claims getTokenClaim(String token) {
try {
return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
} catch (SignatureException e) {
e.printStackTrace();
throw new 自定义异常类("非法请求");
} catch (ExpiredJwtException e) {
e.printStackTrace();
throw new 自定义异常类("登录已过期");
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
/**
* 获取subject
*/
public String getSubjectFromToken(String token) {
return getTokenClaim(token).getSubject();
}
}
四、使用
//需要的地方注入
@Autowired
private JwtConfig jwtConfig;
@ApiOperation("JWT登录")
@GetMapping("loginJWT")
public ResponseBo loginJWT(HttpServletRequest request, String phone) {
//返回TOKEN用于其他系统认证,不一定一定要传phone,按自己需求修改
String jwtToken = jwtConfig.createToken(phone);
return ResponseBo.success().data(jwtToken);
}
@ApiOperation("验证")
@GetMapping("getInfo")
public ResponseBo getInfo(HttpServletRequest request){
//我这里让前端放入header里面传给我,可以按照需求修改
String token = request.getHeader("token");
String phone = jwtConfig.getSubjectFromToken(token);
return ResponseBo.success().data(phone);
}