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

直接上代码:

  1. package com.lwj.util.aliyuncdn;
  2.  
  3. import java.io.IOException;
  4. import java.io.UnsupportedEncodingException;
  5. import java.net.URLEncoder;
  6. import java.nio.charset.Charset;
  7. import java.security.NoSuchAlgorithmException;
  8. import java.text.SimpleDateFormat;
  9. import java.util.Comparator;
  10. import java.util.Date;
  11. import java.util.Iterator;
  12. import java.util.Map;
  13. import java.util.Map.Entry;
  14. import java.util.SimpleTimeZone;
  15. import java.util.TreeMap;
  16.  
  17. import javax.crypto.Mac;
  18. import javax.crypto.SecretKey;
  19. import javax.crypto.spec.SecretKeySpec;
  20.  
  21. import org.apache.http.HttpEntity;
  22. import org.apache.http.HttpResponse;
  23. import org.apache.http.client.ClientProtocolException;
  24. import org.apache.http.client.HttpClient;
  25. import org.apache.http.client.methods.HttpGet;
  26. import org.apache.http.impl.client.HttpClients;
  27. import org.apache.http.util.EntityUtils;
  28.  
  29. import com.lwj.util.aliyunoss.AliyunOssServerInfo;
  30.  
  31. import sun.misc.BASE64Encoder;
  32.  
  33. /**
  34. *
  35. * @Description :阿里云OSS服务器CDN刷新缓存
  36. * @author : liwenjian
  37. * @version : 1.0
  38. * @Date : 2016年8月22日 上午9:37:47
  39. */
  40. public class AliyunCdnUtils {
  41.  
  42. private static final String cdn_server_address = "https://cdn.aliyuncs.com";
  43.  
  44. /**
  45. * 刷新缓存
  46. *
  47. * @param objectPath
  48. * @return
  49. */
  50. public static String refreshObjectCaches(String objectPath) {
  51. // Map<String, String> param = new TreeMap<String, String>();
  52. // param.put("Action", "RefreshObjectCaches");
  53. // param.put("ObjectPath",
  54. // "http://b1.goimg.cn/test/images/1471590829296.png");
  55. // param.put("ObjectType", "File");
  56. AliyunCdnUtils cdn = new AliyunCdnUtils();
  57. Map<String, String> param = new TreeMap<String, String>();
  58. param.put("Action", "RefreshObjectCaches");
  59. param.put("ObjectPath", objectPath);
  60. param.put("ObjectType", "File");
  61. String url = cdn.compose_url(param);
  62. System.out.println("Aliyun CDN RefreshObjectCaches Request Url:" + url);
  63. HttpClient client = HttpClients.createDefault();
  64. HttpGet httpGet = new HttpGet(url);
  65. try {
  66. HttpResponse response = client.execute(httpGet);
  67. HttpEntity entity = response.getEntity();
  68. return EntityUtils.toString(entity, Charset.forName("UTF-8"));
  69. } catch (ClientProtocolException e) {
  70. e.printStackTrace();
  71. } catch (IOException e) {
  72. e.printStackTrace();
  73. }
  74. return null;
  75. }
  76.  
  77. /**
  78. * 组合请求路径
  79. *
  80. * @param user_params
  81. * @return
  82. */
  83. private String compose_url(Map<String, String> user_params) {
  84. // 请求的时间戳。日期格式按照ISO8601标准表示,并需要使用UTC时间。格式为:YYYY-MM-DDThh:mm:ssZ。
  85. // 例如,2014-11-11T12:00:00Z(为北京时间2014年11月11日20点0分0秒)
  86. SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd'T'hh:mm:ss'Z'");
  87. sdf.setTimeZone(new SimpleTimeZone(0, "GMT"));
  88. String timestamp = sdf.format(new Date());
  89. Map<String, String> parameters = new TreeMap<String, String>();
  90. parameters.put("Format", "JSON");
  91. parameters.put("Version", "2014-11-11");
  92. parameters.put("AccessKeyId", AliyunOssServerInfo.getAccessKeyId().trim());
  93. parameters.put("SignatureVersion", "1.0");
  94. parameters.put("SignatureMethod", "HMAC-SHA1");
  95. parameters.put("SignatureNonce", String.valueOf(System.currentTimeMillis()));
  96. parameters.put("TimeStamp", timestamp);
  97. // 添加用户请求参数到签名map中
  98. Iterator<Entry<String, String>> iterator = user_params.entrySet().iterator();
  99. while (iterator.hasNext()) {
  100. Entry<String, String> entry = iterator.next();
  101. parameters.put(entry.getKey(), entry.getValue());
  102. }
  103. String signature = compute_signature(parameters, AliyunOssServerInfo.getAccessKeySecret());
  104. parameters.put("Signature", signature);
  105. return cdn_server_address + "/?" + map_to_url(parameters);
  106. }
  107.  
  108. /**
  109. * 计算签名
  110. *
  111. * @param parameters
  112. * @param access_key_secret
  113. * @return
  114. * @throws UnsupportedEncodingException
  115. * @throws NoSuchAlgorithmException
  116. */
  117. private String compute_signature(Map<String, String> parameters, String access_key_secret) {
  118. try {
  119. StringBuilder canonicalizedQueryString = new StringBuilder();
  120. // 调用Map进行字典排序
  121. parameters = sortMap(parameters);
  122. // 一、按照参数名称的字典顺序对请求中所有的请求参数(包括文档中描述的“公共请求参数”和给定了的请求接口的自定义参数,但不能包括“公共请求参数”中提到Signature参数本身)进行排序。
  123. // 遍历组合组合签名
  124. Iterator<Entry<String, String>> iterator = parameters.entrySet().iterator();
  125. while (iterator.hasNext()) {
  126. Entry<String, String> entry = iterator.next();
  127. // 对Map键值对进行URL编码
  128. // 二、对每个请求参数的名称和值进行编码。名称和值要使用UTF-8字符集进行URL编码,URL编码的编码规则是:
  129. // (1)对于字符 A-Z、a-z、0-9以及字符“-”、“_”、“.”、“~”不编码;
  130. // (2)对于其他字符编码成“%XY”的格式,其中XY是字符对应ASCII码的16进制表示。比如英文的双引号(”)对应的编码就是%22
  131. // (3)对于扩展的UTF-8字符,编码成“%XY%ZA…”的格式;
  132. // (4)需要说明的是英文空格( )要被编码是%20,而不是加号(+)。
  133. canonicalizedQueryString.append("&").append(percent_encode(entry.getKey())).append("=")
  134. .append(percent_encode(entry.getValue()));
  135. }
  136. // 三、调用percent_encode方法把编码后的字符串中加号(+)替换成%20、星号(*)替换成%2A、%7E替换回波浪号(~)
  137. String stringToSign = "GET&%2F&" + percent_encode(canonicalizedQueryString.toString().substring(1).trim());
  138. // 按照RFC2104的定义,使用上面的用于签名的字符串计算签名HMAC值。注意:计算签名时使用的Key就是用户持有的Access
  139. // Key Secret并加上一个“&”字符(ASCII:38),使用的哈希算法是SHA1
  140. String key = AliyunOssServerInfo.getAccessKeySecret() + "&";
  141. SecretKey secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
  142. Mac mac = Mac.getInstance("HmacSHA1");
  143. mac.init(secretKey);
  144. byte[] sign = mac.doFinal(stringToSign.getBytes());
  145. System.out.println("stringToSign:" + stringToSign);
  146. // 得到签名
  147. String signature = (new BASE64Encoder()).encode(sign);
  148. System.out.println("signature:" + signature);
  149. return percent_encode(signature);
  150. } catch (Exception e) {
  151. e.printStackTrace();
  152. }
  153. return null;
  154. }
  155.  
  156. /**
  157. * map转为请求URL
  158. *
  159. * @param parameters
  160. * @return
  161. */
  162. private String map_to_url(Map<String, String> parameters) {
  163. try {
  164. parameters = sortMap(parameters);
  165. StringBuilder url = new StringBuilder();
  166. Iterator<Entry<String, String>> iterator = parameters.entrySet().iterator();
  167. while (iterator.hasNext()) {
  168. Entry<String, String> entry = iterator.next();
  169. url.append("&").append(entry.getKey()).append("=").append(entry.getValue());
  170. }
  171. return url.toString().substring(1);
  172. } catch (Exception e) {
  173. e.printStackTrace();
  174. }
  175. return null;
  176. }
  177.  
  178. /**
  179. * 转换特殊字符
  180. *
  181. * @param param
  182. * @return
  183. */
  184. private String percent_encode(String param) {
  185. try {
  186. // 名称和值要使用UTF-8字符集进行URL编码
  187. param = URLEncoder.encode(param, "UTF-8");
  188. param = param.replaceAll("\\+", "%20");
  189. param = param.replaceAll("\\*", "%2A");
  190. param = param.replaceAll("%7E", "~");
  191. return param;
  192. } catch (Exception e) {
  193. e.printStackTrace();
  194. }
  195. return null;
  196. }
  197.  
  198. /**
  199. * Map排序
  200. *
  201. * @param parameters
  202. * @return
  203. */
  204. private Map<String, String> sortMap(Map<String, String> parameters) {
  205. if (parameters.isEmpty()) {
  206. return null;
  207. }
  208. // 按字典排序
  209. Map<String, String> sortMap = new TreeMap<String, String>(new Comparator<String>() {
  210. @Override
  211. public int compare(String o1, String o2) {
  212. // 指定排序器按照降序排列
  213. // return o2.compareTo(o1);
  214. // 指定排序器按照升序序排列
  215. return o1.compareTo(o2);
  216. }
  217. });
  218. sortMap.putAll(parameters);
  219. return sortMap;
  220. }
  221.  
  222. public static void main(String[] args) {
  223. AliyunCdnUtils a = new AliyunCdnUtils();
  224. Map<String, String> param = new TreeMap<String, String>();
  225. param.put("Action", "RefreshObjectCaches");
  226. param.put("ObjectPath", "http://b1.goimg.cn/test/images/1471590829296.png");
  227. param.put("ObjectType", "File");
  228. String url = a.compose_url(param);
  229. System.out.println("request url:" + url);
  230. HttpClient client = HttpClients.createDefault();
  231. HttpGet httpgets = new HttpGet(url);
  232. try {
  233. HttpResponse response = client.execute(httpgets);
  234. HttpEntity entity = response.getEntity();
  235. System.out.println(EntityUtils.toString(entity, Charset.forName("UTF-8")));
  236. } catch (ClientProtocolException e) {
  237. // TODO Auto-generated catch block
  238. e.printStackTrace();
  239. } catch (IOException e) {
  240. // TODO Auto-generated catch block
  241. e.printStackTrace();
  242. }
  243. }
  244.  
  245. }

成功提示:

  1. {"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. js 表单验证控制代码大全

    js表单验证控制代码大全 关键字:js验证表单大全,用JS控制表单提交 ,javascript提交表单:目录:1:js 字符串长度限制.判断字符长度 .js限制输入.限制不能输入.textarea 长 ...

  2. 隐藏ASP.NET站点的HTTP Headers

    站点的Headers里面会暴露一些服务器的环境,例如IIS版本.语言的环境等 有时候我们不想让用户了解这类信息那么可以这样做: 1.修改web.config 在 <system.webServe ...

  3. 3D滚动下拉菜单-简直不要太任性

    预览 先看看最终效果 简介 由来 最初看到这个是在14年5月,猛戳这里:妙味官网,觉得非常炫.想要做出来,所以就开始学习web. 那时候是做c/s的,也因为这个走上了b/s之路,(゚Д゚≡゚Д゚) 现 ...

  4. 深度解析正则表达式exec和match两者使用的异同以及要注意的地方

    1.match match方法属于String正则表达方法. 语法: str.match(regexp) str:要进行匹配的字符串. regexp:一个正则表达式(或者由RegExp()构造成的正则 ...

  5. 关于swap函数传值的问题

    #include <stdio.h> void swap(int * p3,int * p4); int main() {  int a = 9;  int b = 8;  int * p ...

  6. [原创]Oracle 12c 抢先安装手迹

    [前言] Oracle 12c 终于投放市场了,唉,等了很久了.据官方说这是一个为云计算平台量身定做的版本....且不管真的假的,先让我们把它装上再说. 注:笔者在安装的过程中发现12c的安装过程,较 ...

  7. leetcode 383. Ransom Note

    
Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 all 
th ...

  8. shell十三问

    1) 为何叫做 shell ?在介绍 shell 是甚幺东西之前,不妨让我们重新检视使用者与计算机系统的关系:图(FIXME)我们知道计算机的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱 ...

  9. maven编译报错 -source 1.5 中不支持 lambda 表达式

    在用maven编译项目是由于项目中用了jdk 1.8, 编译是报错  -source 1.5 中不支持 lambda 表达式,Google找到这篇解决方案,记录一下: 编译时报如下错误: [ERROR ...

  10. 点餐系统3个sprint的团队贡献分

    第一次冲刺贡献分   团员名字 贡献分 麦锦俊 18分 冯婉莹 21分 李康梅 19分 张鑫相 20分 曹嘉琪 22分     第二次冲刺贡献分   团员名字 贡献分 麦锦俊 19分 冯婉莹 20分 ...