阿里云CDN刷新预热接口

阿里云OSS映射的文件地址需要即时访问到最新数据,需要即时调用CDN的刷新预热类接口 RefreshObjectCaches 刷新接口。

参考官方接口文档资料:https://help.aliyun.com/document_detail/27200.html?spm=5176.doc27149.6.174.rsPZgC

官方接口调用方式(签名):https://help.aliyun.com/document_detail/27149.html?spm=5176.doc27200.6.154.ldVcDB

直接上代码:

package com.lwj.util.aliyuncdn;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.SimpleTimeZone;
import java.util.TreeMap;

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import com.lwj.util.aliyunoss.AliyunOssServerInfo;

import sun.misc.BASE64Encoder;

/**
 *
 * @Description :阿里云OSS服务器CDN刷新缓存
 * @author : liwenjian
 * @version : 1.0
 * @Date : 2016年8月22日 上午9:37:47
 */
public class AliyunCdnUtils {

    private static final String cdn_server_address = "https://cdn.aliyuncs.com";

    /**
     * 刷新缓存
     *
     * @param objectPath
     * @return
     */
    public static String refreshObjectCaches(String objectPath) {
        // Map<String, String> param = new TreeMap<String, String>();
        // param.put("Action", "RefreshObjectCaches");
        // param.put("ObjectPath",
        // "http://b1.goimg.cn/test/images/1471590829296.png");
        // param.put("ObjectType", "File");
        AliyunCdnUtils cdn = new AliyunCdnUtils();
        Map<String, String> param = new TreeMap<String, String>();
        param.put("Action", "RefreshObjectCaches");
        param.put("ObjectPath", objectPath);
        param.put("ObjectType", "File");
        String url = cdn.compose_url(param);
        System.out.println("Aliyun CDN RefreshObjectCaches Request Url:" + url);
        HttpClient client = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        try {
            HttpResponse response = client.execute(httpGet);
            HttpEntity entity = response.getEntity();
            return EntityUtils.toString(entity, Charset.forName("UTF-8"));
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 组合请求路径
     *
     * @param user_params
     * @return
     */
    private String compose_url(Map<String, String> user_params) {
        // 请求的时间戳。日期格式按照ISO8601标准表示,并需要使用UTC时间。格式为:YYYY-MM-DDThh:mm:ssZ。
        // 例如,2014-11-11T12:00:00Z(为北京时间2014年11月11日20点0分0秒)
        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd‘T‘hh:mm:ss‘Z‘");
        sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));
        String timestamp = sdf.format(new Date());
        Map<String, String> parameters = new TreeMap<String, String>();
        parameters.put("Format", "JSON");
        parameters.put("Version", "2014-11-11");
        parameters.put("AccessKeyId", AliyunOssServerInfo.getAccessKeyId().trim());
        parameters.put("SignatureVersion", "1.0");
        parameters.put("SignatureMethod", "HMAC-SHA1");
        parameters.put("SignatureNonce", String.valueOf(System.currentTimeMillis()));
        parameters.put("TimeStamp", timestamp);
        // 添加用户请求参数到签名map中
        Iterator<Entry<String, String>> iterator = user_params.entrySet().iterator();
        while (iterator.hasNext()) {
            Entry<String, String> entry = iterator.next();
            parameters.put(entry.getKey(), entry.getValue());
        }
        String signature = compute_signature(parameters, AliyunOssServerInfo.getAccessKeySecret());
        parameters.put("Signature", signature);
        return cdn_server_address + "/?" + map_to_url(parameters);
    }

    /**
     * 计算签名
     *
     * @param parameters
     * @param access_key_secret
     * @return
     * @throws UnsupportedEncodingException
     * @throws NoSuchAlgorithmException
     */
    private String compute_signature(Map<String, String> parameters, String access_key_secret) {
        try {
            StringBuilder canonicalizedQueryString = new StringBuilder();
            // 调用Map进行字典排序
            parameters = sortMap(parameters);
            // 一、按照参数名称的字典顺序对请求中所有的请求参数(包括文档中描述的“公共请求参数”和给定了的请求接口的自定义参数,但不能包括“公共请求参数”中提到Signature参数本身)进行排序。
            // 遍历组合组合签名
            Iterator<Entry<String, String>> iterator = parameters.entrySet().iterator();
            while (iterator.hasNext()) {
                Entry<String, String> entry = iterator.next();
                // 对Map键值对进行URL编码
                // 二、对每个请求参数的名称和值进行编码。名称和值要使用UTF-8字符集进行URL编码,URL编码的编码规则是:
                // (1)对于字符 A-Z、a-z、0-9以及字符“-”、“_”、“.”、“~”不编码;
                // (2)对于其他字符编码成“%XY”的格式,其中XY是字符对应ASCII码的16进制表示。比如英文的双引号(”)对应的编码就是%22
                // (3)对于扩展的UTF-8字符,编码成“%XY%ZA…”的格式;
                // (4)需要说明的是英文空格( )要被编码是%20,而不是加号(+)。
                canonicalizedQueryString.append("&").append(percent_encode(entry.getKey())).append("=")
                        .append(percent_encode(entry.getValue()));
            }
            // 三、调用percent_encode方法把编码后的字符串中加号(+)替换成%20、星号(*)替换成%2A、%7E替换回波浪号(~)
            String stringToSign = "GET&%2F&" + percent_encode(canonicalizedQueryString.toString().substring(1).trim());
            // 按照RFC2104的定义,使用上面的用于签名的字符串计算签名HMAC值。注意:计算签名时使用的Key就是用户持有的Access
            // Key Secret并加上一个“&”字符(ASCII:38),使用的哈希算法是SHA1
            String key = AliyunOssServerInfo.getAccessKeySecret() + "&";
            SecretKey secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(secretKey);
            byte[] sign = mac.doFinal(stringToSign.getBytes());
            System.out.println("stringToSign:" + stringToSign);
            // 得到签名
            String signature = (new BASE64Encoder()).encode(sign);
            System.out.println("signature:" + signature);
            return percent_encode(signature);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * map转为请求URL
     *
     * @param parameters
     * @return
     */
    private String map_to_url(Map<String, String> parameters) {
        try {
            parameters = sortMap(parameters);
            StringBuilder url = new StringBuilder();
            Iterator<Entry<String, String>> iterator = parameters.entrySet().iterator();
            while (iterator.hasNext()) {
                Entry<String, String> entry = iterator.next();
                url.append("&").append(entry.getKey()).append("=").append(entry.getValue());
            }
            return url.toString().substring(1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 转换特殊字符
     *
     * @param param
     * @return
     */
    private String percent_encode(String param) {
        try {
            // 名称和值要使用UTF-8字符集进行URL编码
            param = URLEncoder.encode(param, "UTF-8");
            param = param.replaceAll("\\+", "%20");
            param = param.replaceAll("\\*", "%2A");
            param = param.replaceAll("%7E", "~");
            return param;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Map排序
     *
     * @param parameters
     * @return
     */
    private Map<String, String> sortMap(Map<String, String> parameters) {
        if (parameters.isEmpty()) {
            return null;
        }
        // 按字典排序
        Map<String, String> sortMap = new TreeMap<String, String>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                // 指定排序器按照降序排列
                // return o2.compareTo(o1);
                // 指定排序器按照升序序排列
                return o1.compareTo(o2);
            }
        });
        sortMap.putAll(parameters);
        return sortMap;
    }

    public static void main(String[] args) {
        AliyunCdnUtils a = new AliyunCdnUtils();
        Map<String, String> param = new TreeMap<String, String>();
        param.put("Action", "RefreshObjectCaches");
        param.put("ObjectPath", "http://b1.goimg.cn/test/images/1471590829296.png");
        param.put("ObjectType", "File");
        String url = a.compose_url(param);
        System.out.println("request url:" + url);
        HttpClient client = HttpClients.createDefault();
        HttpGet httpgets = new HttpGet(url);
        try {
            HttpResponse response = client.execute(httpgets);
            HttpEntity entity = response.getEntity();
            System.out.println(EntityUtils.toString(entity, Charset.forName("UTF-8")));
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

成功提示:

{"RefreshTaskId":"466571432","RequestId":"1F401222-FA52-4F26-B9C2-1CFDEEA58DAB"}
时间: 2024-10-28 21:04:57

阿里云CDN刷新预热接口的相关文章

阿里云 CDN HTTPS 最佳实践系列——动态证书(一)

背景 了解阿里云 CDN 架构的朋友应该知道,阿里云 CDN 7层的接入组件是 Tengine,我们知道 Tengine 原生是支持 SSL 的,只需要在配置文件中配置证书和私钥即可.在 CDN HTTPS 产品化以前,要开通 HTTPS 的域名需要把证书私钥给我们,我们在 Tengine 静态配置中配置,然后再同步到所有 CDN 边缘节点,显然这种方式在越来越多的域名开通 HTTPS 后,Tengine 静态配置文件会越来越大,难以管理,同时也会导致 Tengine reload 变得很慢,这

阿里云 CDN HTTPS 最佳实践——动态密钥套件(三)

背景 在 ssllabs 中可以测试域名的 SSL 安全等级: 影响这个测试等级的最主要因素就是密钥套件,在接入阿里云 CDN 的所有域名中,绝大多数域名评级都是 A,但是有少数域名为了兼容一些老浏览器或者客户端,需要支持比如 RC4 这样的加密算法,这样就导致评级为 B,但用户体验更重要,这就需要为这些对密钥套件有特殊需求的域名特殊配置密钥套件. 另外,当我们调试 https 时,比如抓包分析数据包时,发现应用数据都是加密的,无法分析 HTTP 协议的问题,但是如果我们有私钥,那就有办法可以通

云计算撑起足球盛宴 阿里云CDN智能调度技术解读

摘要: FIFA世界杯是4年一届的足球盛宴,全球的足球球迷们不管是真球迷还是泛球迷都乐在其中.今年世界杯很大的一个特色就是移动互联网直播,球迷朋友们可以在赛事期间通过手机.PAD.电视大屏来观看看高清比赛直播,特别是今年的优酷世界杯,大部分的用户对直播的清晰度和流畅度表示满意. FIFA世界杯是4年一届的足球盛宴,全球的足球球迷们不管是真球迷还是泛球迷都乐在其中.今年世界杯很大的一个特色就是移动互联网直播,球迷朋友们可以在赛事期间通过手机.PAD.电视大屏来观看看高清比赛直播,特别是今年的优酷世

2018双十一阿里云CDN流量包低至72元/年

2018年双十一阿里云产品优惠活动已经上线了,很多云产品的价格都非常劲爆,除了我们常用的云服务器ECS之外,还有CDN流量包. 本次参与阿里云双十一活动的CDN流量包有2款.10T版和1T版,对于有需求的是个不错的选择,都不贵. 废话不多说了,购买流程: 1.加入拼团(活动规则是加入已满6人团,才能享受最低折扣,本团已经满6人了.注意:别的地方可没有这么高的折扣) 2018双十一阿里云CDN流量包低至72元/年 :http://t.cn/EZBhnoO 2.选择购买"CDN流量包10T版/1T版

护航Lazada双11购物节 阿里云CDN全球化火力全开

摘要: Lazada是东南亚最大B2C平台,业务范围覆盖印度尼西亚.马来西亚.菲律宾.新加坡.泰国和越南六个东南亚国家,覆盖大约6亿消费者.在双11期间,阿里云CDN为Lazada电商内容加速,并且通过独家的直播解决方案,帮助Lazada把双11晚会推送到泰国.马来西亚,和东南亚人一起狂欢双11. 2018年11月12日零点--东南亚最大的电子商务公司Lazada 2018双11购物节正式收官.这是一场超过2000万的消费者在Lazada网站上及APP上浏览和疯狂抢购的盛会. Lazada是东南

阿里云CDN实时日志服务是什么?

阿里云CDN实时日志服务重磅发布!在飞天技术汇第43期,阿里云发布了CDN实时日志服务,直播及回看地址:https://yq.aliyun.com/live/699?source=5176.11533457&userCode=ahxhg8oc&type=copy --日志秒级交付.一站式投递.多维数据分析和定制能力.一键配置,业务决策尽在运筹帷幄之中. 下面,我们来看看什么是实时日志? 在借助CDN访问各种的图片.文字或者视频资源时,CDN会产生大量的日志数据,CDN会实时采集这些日志数据

阿里云CDN接入踩坑记录

最近负责的系统安全要求接入CDN,避免DDOS之类攻击,然后华丽丽踩了两个大坑.回顾问题原因后,发现还是相关人员都对CDN原理不够熟悉.了解导致. 坑一:默认支持的文件上传最大是300M 问题现象: 接入CDN后,连续两个用户反馈视频上传失败.系统对视频最大长度有限制,一开始引导用户确认时长,后来给力的用户居然定位到精超过300M就上传失败. 问题原因: 1.除了接入CDN,系统未进行任何变更,因此很快定位到是接入CDN导致. 2.跟阿里云咨询,确认如下:默认支持的最大文件为300M:可以申请放

阿里云CDN的一些资料记录

一.源站和回源HOST的区别: 源站: 源站决定了回源时,请求到的具体IP. 回源HOST:回源HOST决定了回源请求访问到该IP上的具体站点.二.回源HOST的默认值为: 如果源站是 IP类型,回源HOST默认为加速域名. 如果源站是 OSS源站类型,回源HOST默认为源站域名.三.CDN节点默认缓存策略 缓存时间计算 t =(savetime - last_modified)*0.1 t = max(10, t) t = min(t, 3600) 缓存时间为t,单位秒 默认缓存规则 当对象l

【技术干货】听阿里云CDN安防技术专家金九讲SystemTap使用技巧

1.简介 SystemTap是一个Linux非常有用的调试(跟踪/探测)工具,常用于Linux 内核或者应用程序的信息采集,比如:获取一个函数里面运行时的变 量.调用堆栈,甚至可以直接修改变量的值,对诊断性能或功能问题非 常有帮助.SystemTap提供非常简单的命令行接口和很简洁的脚本语 言,以及非常丰富的tapset和例子. 2.何时使用 定位(内核)函数位置 查看函数被调用时的调用堆栈.局部变量.参数 查看函数指针变量实际指的是哪个函数 查看代码的执行轨迹(哪些行被执行了) 查看内核或者进