nginx 使用 openRestry 版本
在配置文件中設置
# 路徑加密 文件
location ^~/group/ {
access_by_lua '
-- 獲取請求路徑,不包括參數。例如:/group/456.png
local uri = ngx.var.uri;
-- 獲取請求參數
local args = ngx.req.get_uri_args();
-- 獲取請求參數中時間戳信息,傳入的是毫秒
local ts = args["ts"];
-- 獲取請求參數中 token 信息
local token1 = args["token"];
-- 更新系統緩存時間戳
ngx.update_time();
-- 獲取當前服務器系統時間,ngx.time() 獲取的是秒
local getTime = ngx.time() * 1000;
-- 計算時間差
local diffTime = tonumber(ts) - getTime;
-- md5 加鹽加密
local token2 = ngx.md5(tostring(uri) .. "salt" .. tostring(ts));
-- 判斷時間是否有效
if (tonumber(diffTime) > 0) then
-- 校驗 token 是否相等
if token1 == token2 then
-- 校驗通過則轉發請求
ngx.exec("@fastDFS");
end
end
';
}
# 使用 lua 腳本 進行路徑判斷
# 獲取當前系統時間,並返回 ###
location /getTime {
default_type text/html;
content_by_lua '
ngx.say(ngx.time() * 1000);
';
}
以上為nginx.conf 中配置的信息
java 生成對應的url token
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import org.junit.Test;
import org.springframework.util.DigestUtils;
/**
* @description 生成帶有效期與 token 的 URL 測試
* @author HochenChong
* @date 2018-7-15
* @version 0.1
*/
public class NginxTest {
@Test
public void test() {
// 獲取 Nginx 服務器上的系統時間
String requestUrl = "http://localhost/getTime";
long systemTime = Long.parseLong(getURLContent(requestUrl));
System.out.println("Nginx 服務器上系統時間:" + systemTime);
// 請求的資源路徑
String requestResources = "/group/234.jpg";
String url = getUrl(requestResources, systemTime);
System.out.println("請求的 url 為:");
System.out.println("192.168.229.165 /" + url);
}
/**
* 獲取帶時間戳與 token 的 url
* @param requestResources 請求的資源路徑,不包括 IP 地址與端口,開頭有 /,例如 /group1/M00/00/00/wKjlpltF-K-AZQQsAABhhboA1Kk469.png
* @param systemTime 系統時間
* @return 返回請求的 url 地址,包括有效期與 token
*/
public static String getUrl(String requestResources, long systemTime) {
// 添加有效期時間,假設該鏈接有效期為 1 天,即 86400000
// 計算毫秒時,切記轉換為 Long 類型進行運算,避免超出 int 類型的范圍
// 有效期,單位:毫秒
// 自己測試時,為了方便,可以設置為 1 分鍾之類的
long milliseconds = systemTime + 1L * 24 * 60 * 60 * 1000;
// long milliseconds = systemTime + 60L * 1000;
// 計算 token 信息
// “鹽” 值,和 Nginx 服務器上的保持一致即可
String salt = "salt";
// 加密前的字符串:請求的資源路徑 + “鹽” 值 + 時間戳
String beforeEncryptionString = requestResources + salt + milliseconds;
// 這里使用 Spring 提供的 md5 加密工具進行 md5 加密
String token = DigestUtils.md5DigestAsHex(beforeEncryptionString.getBytes());
String url = requestResources + "?ts=" + milliseconds + "&token=" + token;
return url;
}
/**
* 獲取請求 url 返回的文本
* @param requestUrl 請求的 url
* @return
*/
public static String getURLContent(String requestUrl) {
URL url = null;
BufferedReader in = null;
StringBuffer sb = new StringBuffer();
try {
url = new URL(requestUrl);
in = new BufferedReader(new InputStreamReader(url.openStream()));
String str = null;
while ((str = in.readLine()) != null) {
sb.append(str);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
// 關閉資源
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}