一、將私有空間轉換爲空開空間
登錄管理控制檯,選擇空間 => 空間設置 => 基本設置 => 防盜鏈
二、算法實現
基於時間戳防盜鏈的功能其實每家的CDN都是支持的。主要是通過使用約定的加密字符串來對具有訪問有效期的資源鏈接進行一些加密計算的到一個sign
值,然後訪問外鏈裏面帶上這個sign
和截止時間戳去訪問CDN的節點,CDN的節點會用同樣的算法來計算訪問鏈接是否合法,如果不合法則返回403 Forbidden,否則返回所要訪問的資源。
最終形成的訪問外鏈是:http://if-pbl.qiniudn.com/golang.png?v=1&sign=xxxx&t=xxxx
1.工具類
package com.util;
import org.apache.commons.codec.binary.Hex;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author xsx
*/
public class QiNiuAntiLeechUtil {
/**
* 生成資源基於CDN時間戳防盜鏈的訪問外鏈
* @param url 資源原始外鏈
* @param durationInSeconds 結果資源的有效期,單位秒
* @throws MalformedURLException
* @throws UnsupportedEncodingException
* @throws NoSuchAlgorithmException
*/
public static String getAntiLeechAccessUrlBasedOnTimestamp(String url, String encryptKey, int durationInSeconds)
throws MalformedURLException, UnsupportedEncodingException, NoSuchAlgorithmException {
URL urlObj = new URL(url);
String path = urlObj.getPath();
long timestampNow = System.currentTimeMillis() / 1000 + durationInSeconds;
String expireHex = Long.toHexString(timestampNow);
String toSignStr = String.format("%s%s%s", encryptKey, path, expireHex);
String signedStr = md5ToLower(toSignStr);
String signedUrl = null;
if (urlObj.getQuery() != null) {
signedUrl = String.format("%s&sign=%s&t=%s", url, signedStr, expireHex);
} else {
signedUrl = String.format("%s?sign=%s&t=%s", url, signedStr, expireHex);
}
return signedUrl;
}
private static String md5ToLower(String src) throws UnsupportedEncodingException, NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(src.getBytes("utf-8"));
byte[] md5Bytes = digest.digest();
return Hex.encodeHexString(md5Bytes);
}
}
2.生成圖片鏈接
/**
* 獲取圖片url簽名
* @param photoKey 七牛key
* @return
*/
public static String getUrlSign(String photoKey) {
// cdn 配置的基於時間戳防盜鏈的加密字符串,cdn 配置完成後會得到
String encryptKey = "";
// 有效期
int duration = 3600;
// 待加密鏈接
StringBuilder urlBuilder = new StringBuilder();
//七牛圖片域名
urlBuilder.append("http://xxx.xxx.xxx");
urlBuilder.append("/");
//圖片名
urlBuilder.append(photoKey);
String url = urlBuilder.toString();
String urlSigned = null;
try {
//生成鏈接
urlSigned = QiNiuAntiLeechUtil.getAntiLeechAccessUrlBasedOnTimestamp(url,encryptKey,duration);
//imageslim圖片瘦身
urlSigned = urlSigned+"&imageslim";
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return urlSigned;
}