package cn.lili.utils; import cn.lili.cos.CDNConfigProperty; import com.tencentcloudapi.cdn.v20180606.CdnClient; import com.tencentcloudapi.cdn.v20180606.models.DescribePushTasksRequest; import com.tencentcloudapi.cdn.v20180606.models.DescribePushTasksResponse; import com.tencentcloudapi.cdn.v20180606.models.PushUrlsCacheRequest; import com.tencentcloudapi.cdn.v20180606.models.PushUrlsCacheResponse; import com.tencentcloudapi.common.Credential; import com.tencentcloudapi.common.exception.TencentCloudSDKException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.Arrays; @Slf4j @Service @RequiredArgsConstructor public class TencentCdnUtil { private final CDNConfigProperty cdnConfigProperty; public void pushUrlsCache(String[] urls) { try { // 预处理URLs,添加CDN域名 String[] processedUrls = processUrlsWithCdnDomain(urls); log.info("cdn链接:{}", Arrays.toString(processedUrls)); // 为了保护密钥安全,建议将密钥设置在环境变量中或者配置文件中,请参考本文凭证管理章节。 // 硬编码密钥到代码中有可能随代码泄露而暴露,有安全隐患,并不推荐。 Credential cred = new Credential(cdnConfigProperty.getSecretId(), cdnConfigProperty.getSecretKey()); CdnClient client = new CdnClient(cred, "ap-guangzhou"); PushUrlsCacheRequest req = new PushUrlsCacheRequest(); req.setUrls(processedUrls); PushUrlsCacheResponse resp = client.PushUrlsCache(req); log.info("cdn预热返回:{}", client.gson.toJson(resp)); } catch (TencentCloudSDKException e) { log.warn("cdn预热失败:{}", e.toString()); } } /** * 处理URL列表,在每个URL前添加CDN域名 * * @param urls 原始URL列表 * @return 添加了CDN域名的完整URL列表 */ public String[] processUrlsWithCdnDomain(String[] urls) { if (urls == null || urls.length == 0) { return urls; } String cdnDomain = cdnConfigProperty.getCdnDomain(); if (cdnDomain == null || cdnDomain.isEmpty()) { return urls; } String[] processedUrls = new String[urls.length]; for (int i = 0; i < urls.length; i++) { // 如果URL已经包含协议,则直接拼接 if (urls[i].startsWith("http://") || urls[i].startsWith("https://")) { processedUrls[i] = urls[i]; } else { // 确保cdnDomain末尾没有斜杠,urls开头没有斜杠 String domain = cdnDomain.endsWith("/") ? cdnDomain.substring(0, cdnDomain.length() - 1) : cdnDomain; String path = urls[i].startsWith("/") ? urls[i].substring(1) : urls[i]; processedUrls[i] = domain + "/" + path; } } return processedUrls; } }