阿里云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. bzoj 3438: 小M的作物

    Description 背景 小M还是个特么喜欢玩MC的孩纸... 描述 小M在MC里开辟了两块巨大的耕地A和B(你可以认为容量是无穷),现在,小P有n中作物的种子,每种作物的种子有1个(就是可以种一 ...

  2. bzoj 4445 [SCOI2015] 小凸想跑步

    题目大意:一个凸包,随机一个点使得其与前两个点组成的面积比与其他相邻两个点组成的面积小的概率 根据题意列方程,最后求n条直线的交的面积与原凸包面积的比值 #include<bits/stdc++ ...

  3. ios-UserDefaults

    //单例设计模式 /* 1.单例是一种设计模式 是开发人员在开发过程中总结出来的简单方法 2. 如果某个对象在整个工程中有且只有一个(唯一的)就必须使用单例设计模式创建该对象 3.单例设计模式创建的对 ...

  4. goaccess的安装和使用

    一.简介1.goaccess用于分析apache和nginx日志的强大工具 2.官网:https://goaccess.io 二.安装1.下载goaccess的安装包wget http://tar.g ...

  5. ECMAScript Web APIs node.js

    https://hacks.mozilla.org/2015/04/es6-in-depth-an-introduction/ What falls under the scope of ECMASc ...

  6. ruby 随笔

    1.A Server is running获取PID lsof -wni tcp:3000关闭PID kill -9 pID2.rubymine注册码http://idea.lanyus.com/ 3 ...

  7. css 居中问题

    水平居中有text-align:center 和 margin:0 auto,前者是针对父元素进行设置而后者则是对子元素.margin:0 auto; 这里实现的前提是子元素没有float 浮动起来, ...

  8. Repeater嵌套Repeater并取得嵌套Repeater里面的控件

    前台代码:    <asp:Repeater ID="RepeaterScene" runat="server" OnItemDataBound=&quo ...

  9. (js) 输入框只能输入中文、英文、数字、@符号和.符号

    只能输入中文.英文.数字.@符号和.符号<input type="text" onkeyup="value=value.replace(/[^\a-\z\A-\Z0 ...

  10. Apache 配置多端口

    Apache 配置多端口,主要是以下步骤 1. 如果电脑是64位的,官网上下载WampServe,装的过程中如果出现msvcp110.dll丢失的话,解决办法如下: 1.1 首先是打开浏览器,在浏览器 ...