|
|
@@ -61,55 +61,41 @@ public class TermBusiness {
|
|
|
private final IXfTermService termService;
|
|
|
private final TokenManager tokenManager;
|
|
|
private final DefaultConfig defaultConfig;
|
|
|
-
|
|
|
+ // 常量定义(2000-01-01 00:00:00+8 的固定时间戳)
|
|
|
+ private static final long MIN_TIME = LocalDateTime.of(2000, 1, 1, 0, 0, 0)
|
|
|
+ .toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
+ private static final long TOKEN_EXPIRE_HOURS = 2;
|
|
|
+ private static final long TOKEN_EXPIRE_MS = TOKEN_EXPIRE_HOURS * 3600000;
|
|
|
public R<TermToken> getTermToken(Long termNo, String admin, String pwd) {
|
|
|
- // XfTermVo termVo = termService.queryVoOneByNo(termNo);
|
|
|
RemoteXfTermVo remoteVo = remoteTermService.queryByNo(termNo, defaultConfig.getTenantId());
|
|
|
if (ObjectUtil.isEmpty(remoteVo)) {
|
|
|
return R.fail(MessageFormat.format("机号为[{0}]的设备不存在", termNo), null);
|
|
|
}
|
|
|
- RemoteUserVo userVo = remoteUserService.selectUserVoByUserName(admin, defaultConfig.getTenantId());
|
|
|
- if (ObjectUtil.isEmpty(userVo)) {
|
|
|
- return R.fail(MessageFormat.format("用户为[{0}]的用户不存在", admin), null);
|
|
|
- }
|
|
|
- TermToken termToken = null;
|
|
|
- synchronized (locker) {
|
|
|
- String strTermNo = String.valueOf(termNo);
|
|
|
- termToken = tokenManager.getTermToken().get(strTermNo);
|
|
|
- if (ObjectUtil.isEmpty(termToken)) {
|
|
|
- LocalDateTime ldt = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
|
|
|
- Date minDate = Date.from(ldt.toInstant(ZoneOffset.of("+8")));
|
|
|
-
|
|
|
- LocalDateTime now = LocalDateTime.now();
|
|
|
- LocalDateTime expireTime = now.plusHours(2);
|
|
|
- // termToken = new TermToken(strTermNo, UUID.randomUUID().toString(), admin, new Date().getTime(), minDate.getTime(),
|
|
|
- // Date.from(expireTime.toInstant(ZoneOffset.of("+8"))).getTime());
|
|
|
+ //RemoteUserVo userVo = remoteUserService.selectUserVoByUserName(admin, defaultConfig.getTenantId());
|
|
|
+ //if (ObjectUtil.isEmpty(userVo)) {
|
|
|
+ // return R.fail(MessageFormat.format("用户为[{0}]的用户不存在", admin), null);
|
|
|
+ //}
|
|
|
+ final String strTermNo = String.valueOf(termNo);
|
|
|
+ final String roomName = remoteVo.getRoomName();
|
|
|
|
|
|
- termToken = new TermToken(strTermNo, UUID.randomUUID().toString(), admin, new Date().getTime(), minDate.getTime(),
|
|
|
- Date.from(expireTime.toInstant(ZoneOffset.of("+8"))).getTime(), remoteVo.getRoomName());
|
|
|
+ // 使用termNo字符串作为锁对象,减小锁粒度
|
|
|
+ synchronized (strTermNo.intern()) {
|
|
|
+ Map<String, TermToken> tokenMap = tokenManager.getTermToken();
|
|
|
+ TermToken termToken = tokenMap.get(strTermNo);
|
|
|
|
|
|
- tokenManager.getTermToken().put(strTermNo, termToken);
|
|
|
+ if (ObjectUtil.isEmpty(termToken)) {
|
|
|
+ termToken = createNewTermToken(strTermNo, admin, roomName);
|
|
|
+ tokenMap.put(strTermNo, termToken);
|
|
|
} else {
|
|
|
- if (termToken.getExpireTime() < new Date().getTime()) {
|
|
|
- LocalDateTime ldt = LocalDateTime.of(2000, 1, 1, 0, 0, 0);
|
|
|
- Date minDate = Date.from(ldt.toInstant(ZoneOffset.of("+8")));
|
|
|
-
|
|
|
- LocalDateTime now = LocalDateTime.now();
|
|
|
- LocalDateTime expireTime = now.plusHours(2);
|
|
|
- Date expireDate = Date.from(expireTime.toInstant(ZoneOffset.of("+8")));
|
|
|
-
|
|
|
- termToken.setAdmin(admin);
|
|
|
- termToken.setToken(UUID.randomUUID().toString());
|
|
|
- termToken.setDateTime(DateUtil.date().getTime());
|
|
|
- termToken.setAuthTime(minDate.getTime());
|
|
|
- termToken.setExpireTime(expireDate.getTime());
|
|
|
- termToken.setRoomName(remoteVo.getRoomName());
|
|
|
+ long currentTime = System.currentTimeMillis();
|
|
|
+ if (termToken.getExpireTime() < currentTime) {
|
|
|
+ resetTermToken(termToken, admin, roomName);
|
|
|
} else {
|
|
|
termToken.setAdmin(admin);
|
|
|
}
|
|
|
}
|
|
|
+ return R.ok(MessageFormat.format("获取token成功,设备编号[{0}],账号[{1}]", termNo, admin), termToken);
|
|
|
}
|
|
|
- return R.ok(MessageFormat.format("获取token成功,设备编号[{0}],账号[{1}]", termNo, admin), termToken);
|
|
|
}
|
|
|
|
|
|
public R<TermToken> getTermTokenNew(Long termNo, String admin, String pwd){
|
|
|
@@ -302,5 +288,29 @@ public class TermBusiness {
|
|
|
RedisUtils.setCacheObject(cacheName, newToken, Duration.ofHours(4));
|
|
|
return newToken;
|
|
|
}
|
|
|
+ // 创建新令牌
|
|
|
+ private TermToken createNewTermToken(String termNo, String admin, String roomName) {
|
|
|
+ long currentTime = System.currentTimeMillis();
|
|
|
+ return new TermToken(
|
|
|
+ termNo,
|
|
|
+ UUID.randomUUID().toString(),
|
|
|
+ admin,
|
|
|
+ currentTime,
|
|
|
+ MIN_TIME,
|
|
|
+ currentTime + TOKEN_EXPIRE_MS,
|
|
|
+ roomName
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重置过期令牌
|
|
|
+ private void resetTermToken(TermToken token, String admin, String roomName) {
|
|
|
+ long currentTime = System.currentTimeMillis();
|
|
|
+ token.setToken(UUID.randomUUID().toString());
|
|
|
+ token.setAdmin(admin);
|
|
|
+ token.setDateTime(currentTime);
|
|
|
+ token.setAuthTime(MIN_TIME);
|
|
|
+ token.setExpireTime(currentTime + TOKEN_EXPIRE_MS);
|
|
|
+ token.setRoomName(roomName);
|
|
|
+ }
|
|
|
|
|
|
}
|