nealzhuqian 2011-12-19 13:21
浏览 269
已采纳

关于公司一个防止重复下载的问题

情况是这样的,现在公司的网站有一个更新产品的功能,就是用户输入激活码,然后我们会判断数据库中的记录以及他的下载权限,有的话则给处对应的下载链接,用户点链接(现在给出的是实际地址)就可以去下载一个更新文件,然后是对更新是有控制的,分为1次性下载,一段时间内可任意下载,以及永久任意下载。但是现在问题在于拥有1次性和一段时间下载权限的用户,他们可以记录下载地址,那么以后不用输入激活码不用经过判断就可以直接下载更新,就会破坏更新的规则,今天突然想到这个,所以对下载做了如下处理:

生成下载链接的时候,随机生成一个字符串,设置到session中(叫做token)同时往页面上传递同一个值(用tok表示),并将真实下载地址加密,下载的链接改成download.jsp?加密地址&tok

 

EncryptUtil eu = new EncryptUtil();//使用默认密钥加密
String enurl = eu.encrypt(forDown.getLink());//加密URL
String token = StringUtil.getInstance().getString(7);//生成令牌
request.getSession().setAttribute("tok",token);//设置令牌
sb.append("right|"+forDown.getName()+"|"+enurl+"|"+token);
//这里是用ajax返回到页面上,页面上截取字符串生成链接
response.getWriter().print(sb.toString());

生成URL

var info = data.split('|');
$('#showlink').empty().append('<span>'+info[1]+'</span><a href="download.jsp?url='+info[2]+'&t='+info[3]+'">点击这里下载更新包</a>');

在download.jsp上判断session中的token和request来的tok是否相同,相同则将加密地址解密还原,并随机生成另一个字符串,设置到session中,覆盖token,然后服务器跳转,跳往真实下载地址。这样的话用户复制地址不论粘贴到哪,只要下载过后就都会因为token和tok对不上号而下载不了了。

String url = request.getParameter("url");
EncryptUtil eu = new EncryptUtil();//加密解密类
String rUrl = eu.decrypt(url);//解密成下载的真实url
String tok = request.getParameter("t");//获取页面上的令牌
String token = (String)session.getAttribute("tok");//获取session中的令牌
String newToken = StringUtil.getInstance().getString(7);//生成令牌
if(tok.equals(token)){
        session.setAttribute("tok",newToken);//设置令牌
        request.getRequestDispatcher(rUrl).forward(request,response);
}else{
        response.sendRedirect("index.jsp");
}

但是我不太确定这样做是不是很安全,首先习惯用工具下载文件的用户来说这个链接是没法用工具下了,而且对于一次下载的用户来说,如果半路取消则再也不能下载了(因为生成链接后下载次数就清空了),所以目前的问题总结如下:

1、我对限制下载的处理是否安全?

2、可不可以提供一些其他的建议或者思路在这样防止重复下载的场合?

3、对于一次性下载的用户,是否可以用输出流提供下载,判断输出流完成后再清空次数?(有别的思路也请多多指教啦)

  • 写回答

10条回答 默认 最新

  • dingjunfeng 2011-12-21 09:52
    关注

    突然发现一个悲催的问题,昨天是在本地测的,实际上文件放在下载服务器上……那给流下载岂不是我们的主机要去读下载服务器上的文件再提供给客户下载?会不会变慢?

    会不会变慢,要看网络了。
    不需要你去读下载服务器。

    你即然可以给出下载服务器的链接,那下载服务器也应该存在一个web服务。
    也可以用流的试式请求,但现在不知道你们能不能改下载服务器上的实现。
    如果不能的话,现在说的都白费了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀