阿里云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"}

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

  1. 通过AccessKey调用阿里云CDN接口刷新CDN资源案例

    通过AccessKey远程调用阿里云CDN接口,快速实现自动化集成部署. CdnService.java package com.nfky.cdn; import com.aliyuncs.Defau ...

  2. C#调用阿里云CDN API刷新缓存

    使用CDN必须要解决CDN缓存的问题,要么在每次更新文件时生成不同的URL,要么在每次更新文件时刷新CDN缓存.我们在一个实际应用场景中用到了后者,所以需要调用阿里云CDN的API进行缓存刷新的操作. ...

  3. 突破!阿里云CDN实现毫秒级全网刷新

    通常在某网站使用了CDN节点来实现内容分发加速后,当源站内容更新的时候,CDN刷新系统会通过提交刷新请求将CDN节点上的指定缓存内容强制过期.当用户访问的时候,CDN节点将回源获取最新内容返回给用户, ...

  4. 云计算之路-阿里云上:访问阿里云CDN上的图片,自动跳转到百度首页

    昨天有用户向我们反馈一篇博文(一条语句导致CPU持续100%)中的部分图片不能显示,我们的图片访问用的是阿里云CDN,原以为是某个CDN节点不稳定的问题,但在排查时发现这些图片不能显示竟然是因为请求时 ...

  5. 阿里云CDN+OSS完成图片加速

    我们使用React Native开发APP,在列表中显示图片时,列表框经常出现长时间的空白.经过稍微研究和参考其他人的经验,我们知道React Native的ListView以及后来改进版的FlatL ...

  6. 阿里云 CDN 业务基于边缘容器的云原生转型实践

    导读:本文基于边缘容器的阿里云 CDN 云原生实践, 涵盖了边缘容器的背景和趋势,边缘托管集群 ACK Managed Edge K8s(文中简称“Edge@ACK”) 的能力.架构,以及基于边缘容器 ...

  7. 阿里云-CDN

    1.什么是CDN 内容分发网络,意思是将内容(静态资源,如文件等)缓存到全球加速节点,用户请求这些内容时,请求将调度到最近的CDN节点,加快了访问速度. 2.CDN原理 1.用户(北京)向www.a. ...

  8. ThinkPHP3.2.3框架下接入阿里云短信服务接口实现:注册登录

    首先介绍下短信注册登录流程: 注册页面点击获取手机号验证码按钮,用jquery的click事件POST或GET方法把手机号发送到后台控制器: 后台控制器创建函数,收到手机号后生成随机码,例如:6位的随 ...

  9. 阿里云CDN接入踩坑记录

    最近负责的系统安全要求接入CDN,避免DDOS之类攻击,然后华丽丽踩了两个大坑.回顾问题原因后,发现还是相关人员都对CDN原理不够熟悉.了解导致. 坑一:默认支持的文件上传最大是300M 问题现象: ...

随机推荐

  1. linux-系统调用

    p { margin-bottom: 0.1in; line-height: 120% } ● Fork() 创建子进程. 创建单个子进程: pid_t pid; pid = fork(); if(p ...

  2. 关于datagridview里使用combox的总结

    最近写的程序中需要在DataGridView中使用下拉选择的功能,首选方案是列的ColumnType属性 使用EditingControlShowing事件, if (e.Control is Com ...

  3. Thinking in Java——笔记(11)

    Holding Your Objects In general, your programs will always be creating new objects based on some cri ...

  4. Cocoa Touch事件处理流程--响应者链

    Cocoa Touch事件处理流程--响应者链 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9264335 转载请注明 ...

  5. 原生js封装Ajax

    [转载请注明出处] 1 /** * @fileoverview ajax请求公用组件 * @author Limo * @date 2015/08/07 * Native package ajax m ...

  6. 在ubuntu上建立多svn版本库

    http://lucane.iteye.com/blog/857486 mkdir ~/dev/repository svnadmin create ~/dev/repository/a svnadm ...

  7. 自动更新补丁Security Update for Internet Explorer 10 for Windows Server 2008 R2 x64 Edition (KB2964358)失败

    下载http://www.microsoft.com/zh-CN/download/details.aspx?id=42581手动安装成功.

  8. C语言 ---- 指针 iOS学习-----细碎知识点总结

    内存的访问形式:1.直接访问:通过变量名进行访问.2.间接访问:先找到变量存放的地址,然后根据地址去访问对应的内存空间. 指针--- // 定义一个整形指针变量,用来存储num1在内存中的地址    ...

  9. Python实现简单的记账本功能

    目标: 1.使用序列化cPickle 2.账户中钱要大于花费的钱,否则提示请存钱 2.编写函数,实现存钱,花钱,查询及退出功能 1.序列化 pickle是python实现序列化的模块,次模块存在使用C ...

  10. shell常用命令归类整理

    shell 命令整理     bash shell 含有许多功能,因此有许多可用的命令:本文档仅罗列了一些常用命令及其使用频率较高的参数.#本文档仅罗列了一些常用命令及其使用频率较高的参数.#vers ...