Skip to content

Commit 766f02f

Browse files
fix 81 issue 刷新token问题
1 parent f4fba82 commit 766f02f

File tree

3 files changed

+30
-13
lines changed

3 files changed

+30
-13
lines changed

src/main/java/io/geekidea/springbootplus/shiro/cache/LoginRedisService.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,17 @@ public interface LoginRedisService {
3434
*
3535
* @param jwtToken
3636
* @param loginSysUserVo
37-
* @param generate true:生成,false:刷新
3837
*/
39-
void cacheLoginInfo(JwtToken jwtToken, LoginSysUserVo loginSysUserVo, boolean generate);
38+
void cacheLoginInfo(JwtToken jwtToken, LoginSysUserVo loginSysUserVo);
39+
40+
41+
/**
42+
* 刷新登陆信息
43+
* @param oldToken
44+
* @param username
45+
* @param newJwtToken
46+
*/
47+
void refreshLoginInfo(String oldToken,String username,JwtToken newJwtToken);
4048

4149
/**
4250
* 通过用户名,从缓存中获取登陆用户LoginSysUserRedisVo

src/main/java/io/geekidea/springbootplus/shiro/cache/impl/LoginRedisServiceImpl.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public class LoginRedisServiceImpl implements LoginRedisService {
6464
* username:num
6565
*/
6666
@Override
67-
public void cacheLoginInfo(JwtToken jwtToken, LoginSysUserVo loginSysUserVo, boolean generate) {
67+
public void cacheLoginInfo(JwtToken jwtToken, LoginSysUserVo loginSysUserVo) {
6868
if (jwtToken == null) {
6969
throw new IllegalArgumentException("jwtToken不能为空");
7070
}
@@ -112,6 +112,15 @@ public void cacheLoginInfo(JwtToken jwtToken, LoginSysUserVo loginSysUserVo, boo
112112
redisTemplate.opsForValue().set(String.format(CommonRedisKey.LOGIN_USER_TOKEN, username, tokenMd5), loginTokenRedisKey, expireDuration);
113113
}
114114

115+
@Override
116+
public void refreshLoginInfo(String oldToken, String username, JwtToken newJwtToken) {
117+
// 删除之前的token信息
118+
deleteLoginInfo(oldToken, username);
119+
// 缓存登陆信息
120+
LoginSysUserRedisVo loginSysUserRedisVo = getLoginSysUserRedisVo(username);
121+
cacheLoginInfo(newJwtToken, loginSysUserRedisVo);
122+
}
123+
115124
@Override
116125
public LoginSysUserRedisVo getLoginSysUserRedisVo(String username) {
117126
if (StringUtils.isBlank(username)) {
@@ -185,4 +194,5 @@ public void deleteUserAllCache(String username) {
185194
redisTemplate.delete(String.format(CommonRedisKey.LOGIN_SALT, username));
186195
}
187196

197+
188198
}

src/main/java/io/geekidea/springbootplus/shiro/service/impl/LoginServiceImpl.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ public ApiResult login(LoginParam loginParam, HttpServletResponse response) {
119119
subject.login(jwtToken);
120120

121121
// 缓存登陆信息到Redis
122-
loginRedisService.cacheLoginInfo(jwtToken, loginSysUserVo, true);
122+
loginRedisService.cacheLoginInfo(jwtToken, loginSysUserVo);
123123
// 设置响应头
124124
response.setHeader(JwtTokenUtil.getTokenName(), token);
125125
log.debug("登陆成功,username:{}", username);
@@ -160,16 +160,15 @@ public void refreshToken(JwtToken jwtToken, HttpServletResponse httpServletRespo
160160
throw new AuthenticationException("token已无效,请使用已刷新的token");
161161
}
162162
String username = jwtToken.getUsername();
163-
// 生成新token
164-
String newToken = JwtUtil.generateToken(username, jwtToken.getSalt(), Duration.ofSeconds(jwtProperties.getExpireSecond()));
165-
DecodedJWT decodedJWT = JwtUtil.getJwtInfo(token);
166-
jwtToken.setToken(newToken)
167-
.setCreateDate(decodedJWT.getIssuedAt())
168-
.setExpireDate(decodedJWT.getExpiresAt());
163+
String salt = jwtToken.getSalt();
164+
Long expireSecond = jwtProperties.getExpireSecond();
165+
// 生成新token字符串
166+
String newToken = JwtUtil.generateToken(username, salt, Duration.ofSeconds(expireSecond));
167+
// 生成新JwtToken对象
168+
JwtToken newJwtToken = JwtToken.build(newToken, username, salt, expireSecond);
169169
// 更新redis缓存
170-
LoginSysUserRedisVo loginSysUserRedisVo = loginRedisService.getLoginSysUserRedisVo(username);
171-
loginRedisService.cacheLoginInfo(jwtToken, loginSysUserRedisVo, false);
172-
log.debug("刷新token成功,原token:{},新token:{}", jwtToken.getToken(), newToken);
170+
loginRedisService.refreshLoginInfo(token, username, newJwtToken);
171+
log.debug("刷新token成功,原token:{},新token:{}", token, newToken);
173172
// 设置响应头
174173
// 刷新token
175174
httpServletResponse.setStatus(CommonConstant.JWT_REFRESH_TOKEN_CODE);

0 commit comments

Comments
 (0)