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;
|
}
|
|
}
|