|  |  | 
 |  |  | package com.zy.asrs.wms.utils; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSON; | 
 |  |  | import com.zy.asrs.framework.common.Cools; | 
 |  |  | import com.zy.asrs.wms.common.constant.Constants; | 
 |  |  | import com.zy.asrs.wms.common.security.JwtSubject; | 
 |  |  | import io.jsonwebtoken.Claims; | 
 |  |  | import io.jsonwebtoken.Jwts; | 
 |  |  | import io.jsonwebtoken.SignatureAlgorithm; | 
 |  |  | import io.jsonwebtoken.io.Decoders; | 
 |  |  | import io.jsonwebtoken.io.Encoders; | 
 |  |  | import io.jsonwebtoken.security.Keys; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletRequest; | 
 |  |  | import java.security.Key; | 
 |  |  | import java.util.Date; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * JWT工具类 | 
 |  |  |  * | 
 |  |  |  * @author vincent | 
 |  |  |  * @since 2018-01-21 16:30:59 | 
 |  |  |  */ | 
 |  |  | public class JwtUtil { | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取请求中的access_token | 
 |  |  |      * | 
 |  |  |      * @param request HttpServletRequest | 
 |  |  |      * @return String | 
 |  |  |      */ | 
 |  |  |     public static String getAccessToken(HttpServletRequest request) { | 
 |  |  |         String access_token = request.getHeader(Constants.TOKEN_HEADER_NAME); | 
 |  |  |         if (!Cools.isEmpty(access_token)) { | 
 |  |  |             if (access_token.startsWith(Constants.TOKEN_TYPE)) { | 
 |  |  |                 access_token = Utils.removePrefix(access_token, Constants.TOKEN_TYPE).trim(); | 
 |  |  |             } | 
 |  |  |         } else { | 
 |  |  |             access_token = request.getParameter(Constants.TOKEN_PARAM_NAME); | 
 |  |  |         } | 
 |  |  |         return access_token; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 生成token | 
 |  |  |      * | 
 |  |  |      * @param subject          载体 | 
 |  |  |      * @param expire           过期时间 | 
 |  |  |      * @param base64EncodedKey base64编码的Key | 
 |  |  |      * @return token | 
 |  |  |      */ | 
 |  |  |     public static String buildToken(JwtSubject subject, Long expire, String base64EncodedKey) { | 
 |  |  |         return buildToken(JSON.toJSONString(subject), expire, decodeKey(base64EncodedKey)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 生成token | 
 |  |  |      * | 
 |  |  |      * @param subject 载体 | 
 |  |  |      * @param expire  过期时间 | 
 |  |  |      * @param key     密钥 | 
 |  |  |      * @return token | 
 |  |  |      */ | 
 |  |  |     public static String buildToken(String subject, Long expire, Key key) { | 
 |  |  |         Date expireDate = new Date(new Date().getTime() + 1000 * expire); | 
 |  |  |         return Jwts.builder() | 
 |  |  |                 .setSubject(subject) | 
 |  |  |                 .setExpiration(expireDate) | 
 |  |  |                 .setIssuedAt(new Date()) | 
 |  |  |                 .signWith(key) | 
 |  |  |                 .compact(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 解析token | 
 |  |  |      * | 
 |  |  |      * @param token            token | 
 |  |  |      * @param base64EncodedKey base64编码的Key | 
 |  |  |      * @return Claims | 
 |  |  |      */ | 
 |  |  |     public static Claims parseToken(String token, String base64EncodedKey) { | 
 |  |  |         return parseToken(token, decodeKey(base64EncodedKey)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 解析token | 
 |  |  |      * | 
 |  |  |      * @param token token | 
 |  |  |      * @param key   密钥 | 
 |  |  |      * @return Claims | 
 |  |  |      */ | 
 |  |  |     public static Claims parseToken(String token, Key key) { | 
 |  |  |         return Jwts.parserBuilder() | 
 |  |  |                 .setSigningKey(key) | 
 |  |  |                 .build() | 
 |  |  |                 .parseClaimsJws(token) | 
 |  |  |                 .getBody(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取JwtSubject | 
 |  |  |      * | 
 |  |  |      * @param claims Claims | 
 |  |  |      * @return JwtSubject | 
 |  |  |      */ | 
 |  |  |     public static JwtSubject getJwtSubject(Claims claims) { | 
 |  |  |         return JSON.parseObject(claims.getSubject(), JwtSubject.class); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 生成Key | 
 |  |  |      * | 
 |  |  |      * @return Key | 
 |  |  |      */ | 
 |  |  |     public static Key randomKey() { | 
 |  |  |         return Keys.secretKeyFor(SignatureAlgorithm.HS256); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * base64编码key | 
 |  |  |      * | 
 |  |  |      * @return String | 
 |  |  |      */ | 
 |  |  |     public static String encodeKey(Key key) { | 
 |  |  |         return Encoders.BASE64.encode(key.getEncoded()); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * base64编码Key | 
 |  |  |      * | 
 |  |  |      * @param base64EncodedKey base64编码的key | 
 |  |  |      * @return Key | 
 |  |  |      */ | 
 |  |  |     public static Key decodeKey(String base64EncodedKey) { | 
 |  |  |         if (Cools.isEmpty(base64EncodedKey)) { | 
 |  |  |             return null; | 
 |  |  |         } | 
 |  |  |         return Keys.hmacShaKeyFor(Decoders.BASE64.decode(base64EncodedKey)); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } | 
 |  |  | package com.zy.asrs.wms.utils;
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  | import com.alibaba.fastjson.JSON;
 | 
 |  |  | import com.zy.asrs.framework.common.Cools;
 | 
 |  |  | import com.zy.asrs.wms.common.constant.Constants;
 | 
 |  |  | import com.zy.asrs.wms.common.security.JwtSubject;
 | 
 |  |  | import io.jsonwebtoken.Claims;
 | 
 |  |  | import io.jsonwebtoken.Jwts;
 | 
 |  |  | import io.jsonwebtoken.SignatureAlgorithm;
 | 
 |  |  | import io.jsonwebtoken.io.Decoders;
 | 
 |  |  | import io.jsonwebtoken.io.Encoders;
 | 
 |  |  | import io.jsonwebtoken.security.Keys;
 | 
 |  |  | 
 | 
 |  |  | import javax.servlet.http.HttpServletRequest;
 | 
 |  |  | import java.security.Key;
 | 
 |  |  | import java.util.Date;
 | 
 |  |  | 
 | 
 |  |  | /**
 | 
 |  |  |  * JWT工具类
 | 
 |  |  |  *
 | 
 |  |  |  * @author vincent
 | 
 |  |  |  * @since 2018-01-21 16:30:59
 | 
 |  |  |  */
 | 
 |  |  | public class JwtUtil {
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * 获取请求中的access_token
 | 
 |  |  |      *
 | 
 |  |  |      * @param request HttpServletRequest
 | 
 |  |  |      * @return String
 | 
 |  |  |      */
 | 
 |  |  |     public static String getAccessToken(HttpServletRequest request) {
 | 
 |  |  |         String access_token = request.getHeader(Constants.TOKEN_HEADER_NAME);
 | 
 |  |  |         if (!Cools.isEmpty(access_token)) {
 | 
 |  |  |             if (access_token.startsWith(Constants.TOKEN_TYPE)) {
 | 
 |  |  |                 access_token = Utils.removePrefix(access_token, Constants.TOKEN_TYPE).trim();
 | 
 |  |  |             }
 | 
 |  |  |         } else {
 | 
 |  |  |             access_token = request.getParameter(Constants.TOKEN_PARAM_NAME);
 | 
 |  |  |         }
 | 
 |  |  |         return access_token;
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * 生成token
 | 
 |  |  |      *
 | 
 |  |  |      * @param subject          载体
 | 
 |  |  |      * @param expire           过期时间
 | 
 |  |  |      * @param base64EncodedKey base64编码的Key
 | 
 |  |  |      * @return token
 | 
 |  |  |      */
 | 
 |  |  |     public static String buildToken(JwtSubject subject, Long expire, String base64EncodedKey) {
 | 
 |  |  |         return buildToken(JSON.toJSONString(subject), expire, decodeKey(base64EncodedKey));
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * 生成token
 | 
 |  |  |      *
 | 
 |  |  |      * @param subject 载体
 | 
 |  |  |      * @param expire  过期时间
 | 
 |  |  |      * @param key     密钥
 | 
 |  |  |      * @return token
 | 
 |  |  |      */
 | 
 |  |  |     public static String buildToken(String subject, Long expire, Key key) {
 | 
 |  |  |         Date expireDate = new Date(new Date().getTime() + 1000 * expire);
 | 
 |  |  |         return Jwts.builder()
 | 
 |  |  |                 .setSubject(subject)
 | 
 |  |  |                 .setExpiration(expireDate)
 | 
 |  |  |                 .setIssuedAt(new Date())
 | 
 |  |  |                 .signWith(key)
 | 
 |  |  |                 .compact();
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * 解析token
 | 
 |  |  |      *
 | 
 |  |  |      * @param token            token
 | 
 |  |  |      * @param base64EncodedKey base64编码的Key
 | 
 |  |  |      * @return Claims
 | 
 |  |  |      */
 | 
 |  |  |     public static Claims parseToken(String token, String base64EncodedKey) {
 | 
 |  |  |         return parseToken(token, decodeKey(base64EncodedKey));
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * 解析token
 | 
 |  |  |      *
 | 
 |  |  |      * @param token token
 | 
 |  |  |      * @param key   密钥
 | 
 |  |  |      * @return Claims
 | 
 |  |  |      */
 | 
 |  |  |     public static Claims parseToken(String token, Key key) {
 | 
 |  |  |         return Jwts.parserBuilder()
 | 
 |  |  |                 .setSigningKey(key)
 | 
 |  |  |                 .build()
 | 
 |  |  |                 .parseClaimsJws(token)
 | 
 |  |  |                 .getBody();
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * 获取JwtSubject
 | 
 |  |  |      *
 | 
 |  |  |      * @param claims Claims
 | 
 |  |  |      * @return JwtSubject
 | 
 |  |  |      */
 | 
 |  |  |     public static JwtSubject getJwtSubject(Claims claims) {
 | 
 |  |  |         return JSON.parseObject(claims.getSubject(), JwtSubject.class);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * 生成Key
 | 
 |  |  |      *
 | 
 |  |  |      * @return Key
 | 
 |  |  |      */
 | 
 |  |  |     public static Key randomKey() {
 | 
 |  |  |         return Keys.secretKeyFor(SignatureAlgorithm.HS256);
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * base64编码key
 | 
 |  |  |      *
 | 
 |  |  |      * @return String
 | 
 |  |  |      */
 | 
 |  |  |     public static String encodeKey(Key key) {
 | 
 |  |  |         return Encoders.BASE64.encode(key.getEncoded());
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  |     /**
 | 
 |  |  |      * base64编码Key
 | 
 |  |  |      *
 | 
 |  |  |      * @param base64EncodedKey base64编码的key
 | 
 |  |  |      * @return Key
 | 
 |  |  |      */
 | 
 |  |  |     public static Key decodeKey(String base64EncodedKey) {
 | 
 |  |  |         if (Cools.isEmpty(base64EncodedKey)) {
 | 
 |  |  |             return null;
 | 
 |  |  |         }
 | 
 |  |  |         return Keys.hmacShaKeyFor(Decoders.BASE64.decode(base64EncodedKey));
 | 
 |  |  |     }
 | 
 |  |  | 
 | 
 |  |  | }
 |