diff --git a/mall-admin/src/main/java/com/macro/mall/controller/UmsAdminController.java b/mall-admin/src/main/java/com/macro/mall/controller/UmsAdminController.java index 1c45d18..c848c8c 100644 --- a/mall-admin/src/main/java/com/macro/mall/controller/UmsAdminController.java +++ b/mall-admin/src/main/java/com/macro/mall/controller/UmsAdminController.java @@ -63,13 +63,13 @@ public class UmsAdminController { } @ApiOperation(value = "刷新token") - @RequestMapping(value = "/token/refresh", method = RequestMethod.GET) + @RequestMapping(value = "/refreshToken", method = RequestMethod.GET) @ResponseBody public CommonResult refreshToken(HttpServletRequest request) { String token = request.getHeader(tokenHeader); String refreshToken = adminService.refreshToken(token); if (refreshToken == null) { - return CommonResult.failed(); + return CommonResult.failed("token已经过期!"); } Map tokenMap = new HashMap<>(); tokenMap.put("token", refreshToken); diff --git a/mall-portal/src/main/java/com/macro/mall/portal/controller/UmsMemberController.java b/mall-portal/src/main/java/com/macro/mall/portal/controller/UmsMemberController.java index 5fdb856..476251c 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/controller/UmsMemberController.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/controller/UmsMemberController.java @@ -12,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; +import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; @@ -23,6 +24,8 @@ import java.util.Map; @Api(tags = "UmsMemberController", description = "会员登录注册管理") @RequestMapping("/sso") public class UmsMemberController { + @Value("${jwt.tokenHeader}") + private String tokenHeader; @Value("${jwt.tokenHead}") private String tokenHead; @Autowired @@ -68,4 +71,19 @@ public class UmsMemberController { @RequestParam String authCode) { return memberService.updatePassword(telephone,password,authCode); } + + @ApiOperation(value = "刷新token") + @RequestMapping(value = "/refreshToken", method = RequestMethod.GET) + @ResponseBody + public CommonResult refreshToken(HttpServletRequest request) { + String token = request.getHeader(tokenHeader); + String refreshToken = memberService.refreshToken(token); + if (refreshToken == null) { + return CommonResult.failed("token已经过期!"); + } + Map tokenMap = new HashMap<>(); + tokenMap.put("token", refreshToken); + tokenMap.put("tokenHead", tokenHead); + return CommonResult.success(tokenMap); + } } diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/UmsMemberService.java b/mall-portal/src/main/java/com/macro/mall/portal/service/UmsMemberService.java index a31da1b..3564753 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/service/UmsMemberService.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/UmsMemberService.java @@ -56,4 +56,9 @@ public interface UmsMemberService { * 登录后获取token */ String login(String username, String password); + + /** + * 刷新token + */ + String refreshToken(String token); } diff --git a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/UmsMemberServiceImpl.java b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/UmsMemberServiceImpl.java index 0f46bd0..f6428d8 100644 --- a/mall-portal/src/main/java/com/macro/mall/portal/service/impl/UmsMemberServiceImpl.java +++ b/mall-portal/src/main/java/com/macro/mall/portal/service/impl/UmsMemberServiceImpl.java @@ -177,6 +177,11 @@ public class UmsMemberServiceImpl implements UmsMemberService { return token; } + @Override + public String refreshToken(String token) { + return jwtTokenUtil.refreshHeadToken(token); + } + //对输入的验证码进行校验 private boolean verifyAuthCode(String authCode, String telephone){ if(StringUtils.isEmpty(authCode)){ diff --git a/mall-portal/src/main/resources/application.yml b/mall-portal/src/main/resources/application.yml index 1850c5e..a4722b8 100644 --- a/mall-portal/src/main/resources/application.yml +++ b/mall-portal/src/main/resources/application.yml @@ -54,7 +54,7 @@ jwt: tokenHeader: Authorization #JWT存储的请求头 secret: mall-portal-secret #JWT加解密使用的密钥 expiration: 604800 #JWT的超期限时间(60*60*24) - tokenHead: Bearer #JWT负载中拿到开头 + tokenHead: Bearer #JWT负载中拿到开头 ignored: #安全路径白名单 urls: - /swagger-ui.html diff --git a/mall-security/src/main/java/com/macro/mall/security/util/JwtTokenUtil.java b/mall-security/src/main/java/com/macro/mall/security/util/JwtTokenUtil.java index 3c4338d..81eb969 100644 --- a/mall-security/src/main/java/com/macro/mall/security/util/JwtTokenUtil.java +++ b/mall-security/src/main/java/com/macro/mall/security/util/JwtTokenUtil.java @@ -1,5 +1,7 @@ package com.macro.mall.security.util; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; @@ -120,25 +122,49 @@ public class JwtTokenUtil { } /** - * 判断token是否可以被刷新 - */ - private boolean canRefresh(String token) { - return !isTokenExpired(token); - } - - - /** - * 当原来的token没过期是可以刷新 + * 当原来的token没过期时是可以刷新的 * * @param oldToken 带tokenHead的token */ public String refreshHeadToken(String oldToken) { + if(StrUtil.isEmpty(oldToken)){ + return null; + } String token = oldToken.substring(tokenHead.length()); - if (canRefresh(token)) { - Claims claims = getClaimsFromToken(token); + if(StrUtil.isEmpty(token)){ + return null; + } + //token校验不通过 + Claims claims = getClaimsFromToken(token); + if(claims==null){ + return null; + } + //如果token已经过期,不支持刷新 + if(isTokenExpired(token)){ + return null; + } + //如果token在30分钟之内刚刷新过,返回原token + if(tokenRefreshJustBefore(token,30*60)){ + return token; + }else{ claims.put(CLAIM_KEY_CREATED, new Date()); return generateToken(claims); } - return null; + } + + /** + * 判断token在指定时间内是否刚刚刷新过 + * @param token 原token + * @param time 指定时间(秒) + */ + private boolean tokenRefreshJustBefore(String token, int time) { + Claims claims = getClaimsFromToken(token); + Date created = claims.get(CLAIM_KEY_CREATED, Date.class); + Date refreshDate = new Date(); + //刷新时间在创建时间的指定时间内 + if(refreshDate.after(created)&&refreshDate.before(DateUtil.offsetSecond(created,time))){ + return true; + } + return false; } }