TokenUtil

本文介绍了AzueTokenUtil类,用于管理Azure存储容器的token。当token即将过期时,通过Redis缓存和锁机制自动获取新的SasToken并更新,确保服务的稳定性和效率。
摘要由CSDN通过智能技术生成


import cn.hutool.core.util.BooleanUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;

import java.time.LocalDateTime;
import java.util.concurrent.TimeUnit;


@Slf4j
public class AzueTokenUtil {

    private static final String AZURE_TOKEN_KEY = "azure:token:";

    private static final String AZURE_TOKEN_LOCK = "azure:lock:";


    private static AzureStorageConfig config = SpringUtilsAuTo.getBean(AzureStorageConfig.class);

    private static final int duration = 3;


    public static String getAzureToken(String containerName){
        //查到token在有效期内直接返回,逻辑判断提前30分钟过期
        Object azureTokenStr = RedisUtils.get(AZURE_TOKEN_KEY+containerName);
        if(azureTokenStr != null && StringUtils.isNotBlank(azureTokenStr.toString())){
            AzureToken azureToken = JSONObject.parseObject(azureTokenStr.toString(), AzureToken.class);
            if(azureToken.getExpireTime().isAfter(LocalDateTime.now().plusHours(1L))){
                return azureToken.getToken();
            }
        }
        //如果查询token为空或者token过期更新redis中的token
        if(tryLock(AZURE_TOKEN_LOCK+containerName)){
            try {
                //获取azuretoken并写入redis
                String sasToken = BlobHelper.getSasToken(containerName,config);
                AzureToken azureToken = new AzureToken();
                azureToken.setToken(sasToken);
                azureToken.setExpireTime(LocalDateTime.now().plusDays(duration));
                String redisJson = JSONObject.toJSONString(azureToken);
                RedisUtils.set(AZURE_TOKEN_KEY+containerName,redisJson,duration,TimeUnit.DAYS);
            } catch (Exception e) {
                log.error("azure获取文件token" + e.getMessage());
            } finally {
                unLock(AZURE_TOKEN_LOCK+containerName);
            }
        }
        return getAzureToken(containerName);
    }

    static boolean tryLock(String key){
        Boolean flag = RedisUtils.setIfAbsent(key, "1", 10, TimeUnit.SECONDS);
        return BooleanUtil.isTrue(flag);
    }

    static boolean unLock(String key){
        return RedisUtils.del(key);
    }
}

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值