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条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?