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