我有一个项目,我需要从我的服务器流式传输视频,我使用 nginx 来完成它,还使用 spring mvc 开发的 webapp 和 tomcat 来包含它。
它是如何工作的:
java应用程序创建md5哈希链接并将其发送给他可以发出请求的客户端,客户端向nginx服务器发出带有哈希参数的请求,nginx服务器检查哈希值并进行处理。
这是创建哈希链接的java代码:
public static void main(String[] args) throws ParseException, NoSuchAlgorithmException {
String fileName = "bbb.mp4";
Date date = new Date(System.currentTimeMillis());
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
String monthName = getMonthForInt(month);
int day = calendar.get(Calendar.DAY_OF_MONTH);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int min = calendar.get(Calendar.MINUTE);
System.out.println("year " +year +", month "+ month +",day " +day + ", hour " +hour +" min "+ min);
String str = monthName +" "+ day+" "+year+" "+hour+":"+min+":52.454 UTC";
SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS zzz");
Date newDate = df.parse(str);
long epoch = date.getTime();
System.out.println(epoch);
String input = epoch +"/hls/"+fileName+" enigma";
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(input.getBytes());
byte[] enc = md.digest();
String md5Sum = new sun.misc.BASE64Encoder().encode(enc);
String hash = md5Sum.substring( 0,md5Sum.length() -2);
String link = "http://tutorme.ae/hls/"+fileName+"?md5="+hash+"&expires="+epoch;
System.out.println(link);
}
输出应该是这样的:
http://tutorme.ae/hls/bbb.mp4?md5=D3U9uEtwHcgyNL3BeyfLsw&expires=1490178647610
所以这段代码可以工作 50%,另外 50% 会产生一个更苗条的链接:
http://tutorme.ae/hls/bbb.mp4?md5=26k/bhvQP6JC1ehR+XmzuA&expires=1490178663810
我不确定为什么会这样做,线索会有所帮助
谢谢
抱歉,我只是通过添加这行代码来修复它:
hash = hash.replace("/", "_");
在最后一行。我不知道原因,实际上只是因为 linux 命令行中的哈希值与 java 不同。如果有人能解释一下那就太好了
我正在使用您建议的解决方案的修改版,将 302 返回给客户端以重定向下载。根据 nginx_secure_link 模块中的示例,您应该将“+/”替换为“-_”并删除最后 2 个字符
public static void main(String[] args) throws ParseException, NoSuchAlgorithmException {
String fileName = "bbb.mp4";
ZonedDateTime validPeriodTime = ZonedDateTime.parse("2024-12-31T00:00:00+01:00[Europe/Paris]");
long epoch = validPeriodTime.toEpochSecond();
System.out.println(validPeriodTime);
System.out.println(epoch);
String input = epoch +"/s/"+fileName+" enigma";
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(input.getBytes());
byte[] enc = md.digest();
String md5Sum = Base64.getEncoder().encodeToString(enc);
String hash = md5Sum.substring( 0,md5Sum.length() -2);
hash = hash.replace("/", "_").replace("+", "-");
String link = "http://local.host/s/"+fileName+"?m="+hash+"&e="+epoch;
System.out.println(link);
}
在这里你可以找到我的 nginx 配置:
location /files {
root /data/html;
index index.html index.htm;
}
location /s/ {
root /data/html;
add_header Access-Control-Allow-Origin *;
secure_link $arg_m,$arg_e;
secure_link_md5 "$arg_e$uri secret";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
rewrite ^/s/(.*)$ /files/$1 break;
}