依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.12.3</version>
</dependency>
application.yml文件配置
jwt:
admin-secret-key: 1ost-very-long-and-secure-secret-key-32-bytes
admin-ttl: 7200000
admin-token-name: token
JwtProperties.java
package com.nnutc.system.config;
@Configuration
@ConfigurationProperties(prefix = "jwt")
@Component
public class JwtProperties {
private String adminSecretKey;
private long adminTtl;
private String adminTokenName;
public String getAdminSecretKey() {
return adminSecretKey;
}
public void setAdminSecretKey(String adminSecretKey) {
this.adminSecretKey = adminSecretKey;
}
public long getAdminTtl() {
return adminTtl;
}
public void setAdminTtl(long adminTtl) {
this.adminTtl = adminTtl;
}
public String getAdminTokenName() {
return adminTokenName;
}
public void setAdminTokenName(String adminTokenName) {
this.adminTokenName = adminTokenName;
}
}
JwtUtil.java
package com.nnutc.common.utils;
@Component
public class JwtUtil {
String secret = "1ost-very-long-and-secure-secret-key-32-bytes";
int ttl = 7200000;
private Map<String,Object> initClaims(String username){
Map<String, Object> claims = new HashMap<>();
claims.put("iss","olTool");
claims.put("sub",username);
claims.put("exp",generatorExpirationDate());
claims.put("aud","internal use");
claims.put("iat",new Date());
claims.put("jti", UUID.randomUUID().toString());
return claims;
}
public String generatorToken(Map<String,Object> claims){
SecureDigestAlgorithm<SecretKey, SecretKey> algorithm = Jwts.SIG.HS256;
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());
return Jwts.builder()
.claims(claims)
.signWith(key,algorithm)
.compact();
}
public Claims getPayloadFromToken(String token) {
SecretKey key = Keys.hmacShaKeyFor(secret.getBytes());
return Jwts.parser()
.verifyWith(key)
.build()
.parseSignedClaims(token)
.getPayload();
}
public String getUserNameFromToken(String token){
String username;
try
{
username = getPayloadFromToken(token).getSubject();
}catch (Exception e){
username = null;
}
return username;
}
private Date generatorExpirationDate()
{
return new Date(System.currentTimeMillis() + ttl);
}
private boolean isTokenExpired(String token)
{
return getExpiredDateFromToken(token).before(new Date());
}
private Date getExpiredDateFromToken(String token)
{
return getPayloadFromToken(token).getExpiration();
}
public boolean canRefresh(String token){
return !isTokenExpired(token);
}
public String refreshToken(String token){
Claims claims = getPayloadFromToken(token);
Map<String, Object> initClaims = initClaims(claims.getSubject());
initClaims.put("iat",new Date());
return generatorToken(initClaims);
}
}
controller类
String jsonString = JSON.toJSONString(customUserDetails);
Map<String, Object> claims = new HashMap<>();
claims.put("customUserDetails", jsonString);
String token = JwtUtil.createJWT(
jwtProperties.getAdminSecretKey(),
jwtProperties.getAdminTtl(),
claims);
过滤器
package com.nnutc.system.filter;
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Autowired
private JwtProperties jwtProperties;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String uri = request.getRequestURI();
if (uri.equals("/admin/system/index/login")) {
filterChain.doFilter(request, response);
return;
}
String token = request.getHeader("Authorization");
if (!StringUtils.hasText(token)) {
throw new RuntimeException("Token为空");
}
try{
Jws<Claims> claims = JwtUtil.parseJWT(token, jwtProperties.getAdminSecretKey());
filterChain.doFilter(request, response);
}catch (Exception e){
throw new RuntimeException(e);
}
}
}