|
| 1 | +package com.hellokoding.sso.resource; |
| 2 | + |
| 3 | +import io.jsonwebtoken.*; |
| 4 | +import org.slf4j.LoggerFactory; |
| 5 | + |
| 6 | +import javax.servlet.http.HttpServletRequest; |
| 7 | +import java.util.Date; |
| 8 | + |
| 9 | +/** |
| 10 | + * @author XieShaoping |
| 11 | + */ |
| 12 | +public class JwtUtil { |
| 13 | + private static final String REDIS_SET_ACTIVE_SUBJECTS = "active-subjects"; |
| 14 | + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(JwtUtil.class); |
| 15 | + |
| 16 | + public static String generateToken(String signingKey, String subject) { |
| 17 | + long nowMillis = System.currentTimeMillis(); |
| 18 | + Date now = new Date(nowMillis); |
| 19 | + |
| 20 | + JwtBuilder builder = Jwts.builder() |
| 21 | + .setSubject(subject) |
| 22 | + .setIssuedAt(now) |
| 23 | + .signWith(SignatureAlgorithm.HS256, signingKey); |
| 24 | + |
| 25 | + String token = builder.compact(); |
| 26 | + |
| 27 | + RedisUtil.INSTANCE.sadd(REDIS_SET_ACTIVE_SUBJECTS, subject); |
| 28 | + |
| 29 | + return token; |
| 30 | + } |
| 31 | + |
| 32 | + static String parseToken(HttpServletRequest httpServletRequest, String jwtTokenCookieName, String signingKey){ |
| 33 | + String token = CookieUtil.getValue(httpServletRequest, jwtTokenCookieName); |
| 34 | + if(token == null) { |
| 35 | + return null; |
| 36 | + } |
| 37 | + String subject = null; |
| 38 | + try { |
| 39 | + subject = Jwts.parser() |
| 40 | + .setSigningKey(signingKey) |
| 41 | + .parseClaimsJws(token) |
| 42 | + .getBody() //获取Claims |
| 43 | + .getSubject(); |
| 44 | + } catch (ExpiredJwtException e) { |
| 45 | + logger.error("过期异常"); |
| 46 | + } catch (UnsupportedJwtException e) { |
| 47 | + logger.error("不支持的Jwt异常"); |
| 48 | + } catch (MalformedJwtException e) { |
| 49 | + logger.error("格式错误的Jwt异常"); |
| 50 | + } catch (SignatureException e) { |
| 51 | + logger.error("签名异常"); |
| 52 | + } catch (IllegalArgumentException e) { |
| 53 | + logger.error("非法参数异常"); |
| 54 | + } |
| 55 | + //验证判断标准 |
| 56 | + if (subject!=null&&!RedisUtil.INSTANCE.sismember(REDIS_SET_ACTIVE_SUBJECTS, subject)) { |
| 57 | + return null; |
| 58 | + } |
| 59 | + |
| 60 | + return subject; |
| 61 | + } |
| 62 | + |
| 63 | + static void invalidateRelatedTokens(HttpServletRequest httpServletRequest) { |
| 64 | + RedisUtil.INSTANCE.srem(REDIS_SET_ACTIVE_SUBJECTS, (String) httpServletRequest.getAttribute("username")); |
| 65 | + } |
| 66 | +} |
| 67 | + |
0 commit comments