因为延时的信息处理,没有用户登陆系统,所以无法获取系统的令牌,导致无法处理
解决方法为:在系统新增一个默认用户由于这种异步延时信息处理使用,再获取加密后的密码和账号,调用登陆方法,获取到令牌。
登陆获取令牌工作类
@Component
public class TokenUtils {
@Autowired
private RemoteAuthService remoteAuthService;
@Value("${mq.token.username}")
private String username;
@Value("${mq.token.password}")
private String password;
private String token;
private LocalDateTime expireTime;
public String getToken(){
if (token != null && LocalDateTime.now().isBefore(expireTime)){
return token;
}
refreshToken();
return token;
}
private void refreshToken(){
R<?> loginResult =remoteAuthService.jwtLogin(username, password);
if (loginResult.getCode() != HttpStatus.SUCCESS){
throw new RuntimeException(String.format("获取token失败,msg:%s", loginResult.getMsg()));
}
Object data = loginResult.getData();
Map<String, Object> resultMap = (Map<String, Object>) data;
token = (String) resultMap.get("access_token");
Integer expires = (Integer) resultMap.get("expires_in");
expireTime = LocalDateTime.now().plus(expires, ChronoUnit.SECONDS);
}
}
用户的账户和密码可写在nacos中
再就是处理异步线程获取当前线程的令牌的工具类
/**
* 线程共享token工具类
*/
public class RequestTokenHolder {
private static final ThreadLocal<String> THREAD_LOCAL = new ThreadLocal<>();
public static void setToken(String token){
THREAD_LOCAL.set(token);
}
public static String getToken(){
return THREAD_LOCAL.get();
}
public static void removeToken(){
THREAD_LOCAL.remove();
}
}
使用方法:
RequestTokenHolder.setToken(tokenUtils.getToken());
//结束后移除
RequestTokenHolder.removeToken();