package com.vincent.rsf.openApi.service.impl; import com.vincent.rsf.openApi.security.service.AppAuthService; import com.vincent.rsf.openApi.service.TokenService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @Slf4j @Service public class TokenServiceImpl implements TokenService { private static final long EXPIRE_MS = 60 * 60 * 1000L; @Autowired private AppAuthService appAuthService; private final Map tokenExpire = new ConcurrentHashMap<>(); @Override public String issueToken(String appId, String appSecret) { if (!StringUtils.hasText(appId) || !StringUtils.hasText(appSecret)) { return null; } if (!appAuthService.validateApp(appId, appSecret)) { return null; } String token = UUID.randomUUID().toString().replace("-", ""); tokenExpire.put(token, System.currentTimeMillis() + EXPIRE_MS); evictExpired(); return token; } @Override public boolean validateToken(String token) { if (!StringUtils.hasText(token)) { return false; } Long expire = tokenExpire.get(token); if (expire == null || System.currentTimeMillis() > expire) { tokenExpire.remove(token); return false; } return true; } private void evictExpired() { long now = System.currentTimeMillis(); tokenExpire.entrySet().removeIf(e -> e.getValue() < now); } }