JWT的介绍和优缺点在此就不做说明了,相信这些网上的介绍比这里三言两语更加清楚,本文用于单点登录的,提高用户体验。
- 生成token,返回给前端,前端可储存于cookie中,后面调用api接口时发送给后端
public static final long EXPIRATION_TIME = 3600_000; // 1 hour public static final String SECRET = "secret"; public static final String TOKEN_PREFIX = "Bearer"; public static final String HEADER_STRING = "Authorization"; public static final String ROLE = "ROLE"; public static String getToken(String userRole) { HashMap<String, Object> map = new HashMap<>(); map.put(ROLE, userRole); String jwt = Jwts.builder() .setClaims(map) //playload部分 .setSubject("主题") // 主题 .setIssuer("jay") // 签发者 .setIssuedAt(new Date()) // 签发时间 .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) //过期时间 .signWith(SignatureAlgorithm.HS512, SECRET) //签名 .compact(); return TOKEN_PREFIX + " " + jwt; }
- 解析token,取出playload部分的数据,以作对比
public static HttpServletRequest validateTokenAndAddUserIdToHeader(HttpServletRequest request) { String token = request.getHeader(HEADER_STRING); if (token != null) { // parse the token. try { Map<String, Object> body = Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(token.replace(TOKEN_PREFIX, "")) .getBody(); return new CustomHttpServletRequest(request, body); } catch (Exception e) { logger.info(e.getMessage()); throw new TokenValidationException(e.getMessage()); } } else { throw new TokenValidationException("Missing token"); } }
- 解析部分一般在拦截器中处理,过期超时则返回登录页,token的过期时间也可使用以旧换新的方式,如App,每次打开App的时候刷新token的过期时间,这样就可以避免用户重复登录了。
类似文章推荐:https://www.jianshu.com/p/fe67b4bb6f2c
GitHub推荐:https://github.com/ZhongjunTian/spring-boot-jwt-demo/basic