package com.gkhy.labRiskManage.application.account.service.impl; import com.gkhy.labRiskManage.application.account.dto.respDto.TokenInfoDto; import com.gkhy.labRiskManage.application.account.service.TokenAppService; import com.gkhy.labRiskManage.commons.domain.Result; import com.gkhy.labRiskManage.commons.enums.ResultCode; import com.gkhy.labRiskManage.commons.enums.SystemCacheKeyEnum; import com.google.common.collect.Range; import com.google.common.hash.Hashing; import org.redisson.api.RMapCache; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeUnit; @Service public class TokenAppServiceImpl implements TokenAppService { @Autowired private RedissonClient redissonClient; @Override public Result setToken(Long uid) { Result result = new Result<>(); if(uid == null){ result.setCode(ResultCode.PARAM_ERROR_NULL.getCode()); result.setMsg("参数缺失"); return result; } String loginUserId = ""+uid; //生成Token String seed = loginUserId+ Range.atLeast(1) +System.nanoTime(); String hash = String.valueOf(Hashing.hmacMd5(loginUserId.getBytes(StandardCharsets.UTF_8)).hashString(seed, StandardCharsets.UTF_8)); //存入redis String accessTokenKey = SystemCacheKeyEnum.KEY_USER_TOKEN.getKey(); try { RMapCache tokenCacheMap = redissonClient.getMapCache(accessTokenKey); tokenCacheMap.remove(loginUserId); tokenCacheMap.put(loginUserId,hash,120, TimeUnit.MINUTES); result.setSuccess(); TokenInfoDto tokenInfoDto = new TokenInfoDto(); tokenInfoDto.setTk(hash); tokenInfoDto.setUid(uid); tokenInfoDto.setRemainSecond(tokenCacheMap.remainTimeToLive(loginUserId)); result.setData(tokenInfoDto); } catch (Exception e) { e.printStackTrace(); } return result; } @Override public Result resetTokenTime(Long uid) { Result result = new Result<>(); if(uid == null){ result.setCode(ResultCode.PARAM_ERROR_NULL.getCode()); result.setMsg("参数缺失"); return result; } String loginUserId = ""+uid; String accessTokenKey = SystemCacheKeyEnum.KEY_USER_TOKEN.getKey(); try { RMapCache tokenCacheMap = redissonClient.getMapCache(accessTokenKey); String tk = (String) tokenCacheMap.get(loginUserId); tokenCacheMap.put(loginUserId,tk,120, TimeUnit.MINUTES); result.setSuccess(); } catch (Exception e) { e.printStackTrace(); } return result; } @Override public Result removeToken(Long uid) { Result result = new Result<>(); if(uid == null){ result.setCode(ResultCode.PARAM_ERROR_NULL.getCode()); result.setMsg("参数缺失"); return result; } String loginUserId = ""+uid; String accessTokenKey = SystemCacheKeyEnum.KEY_USER_TOKEN.getKey(); RMapCache tokenCacheMap = redissonClient.getMapCache(accessTokenKey); tokenCacheMap.remove(loginUserId); result.setSuccess(); return result; } @Override public Result getToken(Long uid) { Result result = new Result<>(); result.setCode(ResultCode.BUSINESS_ERROR_PERMISSION_DENIALED.getCode()); result.setMsg("TOKEN不存在"); if(uid == null){ result.setCode(ResultCode.PARAM_ERROR_NULL.getCode()); result.setMsg("参数缺失"); return result; } String loginUserId = ""+uid; String accessTokenKey = SystemCacheKeyEnum.KEY_USER_TOKEN.getKey(); RMapCache tokenCacheMap = redissonClient.getMapCache(accessTokenKey); Object tokenObject = tokenCacheMap.get(loginUserId); String cacheToken; if(tokenObject != null){ cacheToken = (String) tokenObject; Long tokenRemainTimeToLive = tokenCacheMap.remainTimeToLive(loginUserId); if(cacheToken != null && !cacheToken.isEmpty()){ result.setSuccess(); TokenInfoDto tokenInfoDto = new TokenInfoDto(); tokenInfoDto.setUid(uid); tokenInfoDto.setTk(cacheToken); tokenInfoDto.setRemainSecond(tokenRemainTimeToLive/1000); result.setData(tokenInfoDto); } } return result; } }