peng
2025-10-29 0c9521d93a745de0ec71d83c094a6047c0222398
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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;
    }
 
}