|
@@ -0,0 +1,148 @@
|
|
|
+package com.huimv.manager.util;
|
|
|
+
|
|
|
+import io.jsonwebtoken.*;
|
|
|
+import org.springframework.util.DigestUtils;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.util.Date;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author yinhao
|
|
|
+ * @since 2021/4/19
|
|
|
+ */
|
|
|
+public class JwtUtils {
|
|
|
+
|
|
|
+ private static final long EXPIRE = 1000 * 60 * 60 * 24;
|
|
|
+ private static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";
|
|
|
+ private static final int REFRESH_TIME = 300;
|
|
|
+
|
|
|
+ public static String getJwtToken(Integer id) {
|
|
|
+
|
|
|
+ String JwtToken = Jwts.builder()
|
|
|
+ //头部信息
|
|
|
+ .setHeaderParam("typ", "JWT")
|
|
|
+ .setHeaderParam("alg", "HS256")
|
|
|
+ .setSubject("hm-user")
|
|
|
+ .setIssuedAt(new Date())
|
|
|
+ //过期时间
|
|
|
+ .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
|
|
|
+ //token主体部分,存储用户信息
|
|
|
+ .claim("id", id)
|
|
|
+ .signWith(SignatureAlgorithm.HS256, APP_SECRET)
|
|
|
+ .compact();
|
|
|
+
|
|
|
+ return JwtToken;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断token是否存在与有效
|
|
|
+ *
|
|
|
+ * @param jwtToken
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static boolean checkToken(String jwtToken) {
|
|
|
+ if (StringUtils.isEmpty(jwtToken)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断token是否存在与有效
|
|
|
+ *
|
|
|
+ * @param request
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static boolean checkToken(HttpServletRequest request) {
|
|
|
+ try {
|
|
|
+ String jwtToken = request.getHeader("token");
|
|
|
+ if (StringUtils.isEmpty(jwtToken)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据token获取会员id
|
|
|
+ *
|
|
|
+ * @param request
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Integer getMemberIdByJwtToken(HttpServletRequest request) {
|
|
|
+ String jwtToken = request.getHeader("token");
|
|
|
+ if (StringUtils.isEmpty(jwtToken)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ Claims claims = getClaims(jwtToken);
|
|
|
+ return (Integer) claims.get("id");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据token获取会员nickname
|
|
|
+ *
|
|
|
+ * @param request
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String getMemberNicknameByJwtToken(HttpServletRequest request) {
|
|
|
+ String jwtToken = request.getHeader("token");
|
|
|
+ if (StringUtils.isEmpty(jwtToken)) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ Claims claims = getClaims(jwtToken);
|
|
|
+ return (String) claims.get("nickname");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取claims对象
|
|
|
+ *
|
|
|
+ * @param jwtToken
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static Claims getClaims(String jwtToken) {
|
|
|
+ Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
|
|
|
+ return claimsJws.getBody();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否过期
|
|
|
+ *
|
|
|
+ * @param claims
|
|
|
+ * @return -1:有效,0:有效,1:过期,2:被篡改
|
|
|
+ */
|
|
|
+ public static int verifyToken(Claims claims) {
|
|
|
+ if (claims == null) {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ claims.getExpiration()
|
|
|
+ .before(new Date());
|
|
|
+ // 需要自动刷新TOKEN
|
|
|
+ if ((claims.getExpiration().getTime() - System.currentTimeMillis()) > REFRESH_TIME * 1000) {
|
|
|
+ return -1;
|
|
|
+ } else {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ } catch (ExpiredJwtException ex) {
|
|
|
+ return 1;
|
|
|
+ } catch (Exception e) {
|
|
|
+ return 2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ System.out.println(DigestUtils.md5DigestAsHex("123456".getBytes()));
|
|
|
+// System.out.println(JwtUtils.getJwtToken(10));
|
|
|
+ }
|
|
|
+}
|