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

问题描述

情况是这样的,现在公司的网站有一个更新产品的功能,就是用户输入激活码,然后我们会判断数据库中的记录以及他的下载权限,有的话则给处对应的下载链接,用户点链接(现在给出的是实际地址)就可以去下载一个更新文件,然后是对更新是有控制的,分为1次性下载,一段时间内可任意下载,以及永久任意下载。但是现在问题在于拥有1次性和一段时间下载权限的用户,他们可以记录下载地址,那么以后不用输入激活码不用经过判断就可以直接下载更新,就会破坏更新的规则,今天突然想到这个,所以对下载做了如下处理:生成下载链接的时候,随机生成一个字符串,设置到session中(叫做token)同时往页面上传递同一个值(用tok表示),并将真实下载地址加密,下载的链接改成download.jsp?加密地址&tok EncryptUtil eu = new EncryptUtil();//使用默认密钥加密String enurl = eu.encrypt(forDown.getLink());//加密URLString token = StringUtil.getInstance().getString(7);//生成令牌request.getSession().setAttribute("tok",token);//设置令牌sb.append("right|"+forDown.getName()+"|"+enurl+"|"+token);//这里是用ajax返回到页面上,页面上截取字符串生成链接response.getWriter().print(sb.toString());生成URLvar 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);//解密成下载的真实urlString 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、对于一次性下载的用户,是否可以用输出流提供下载,判断输出流完成后再清空次数?(有别的思路也请多多指教啦) 问题补充:是吗?现在我都还考虑不到CPU这块哦,估计得碰到问题了才会去掌握解决的方法,呵呵。计时的用户可能是我没说清楚,指的是1年或者半年内有权限下载啦,这个是先判断好再弹出提供下载的div的,看来一次下载的还得花点功夫去判断流。谢谢啊。<div class="quote_title">khan 写道</div><div class="quote_div">计次的用户要在代码输出流中做判断,也就是流完成的地方,判断是否下载完成,完成的话做记录。<br />计时的用户这个当然好办了,生成一个可逆的字符串,里面记录允许开始下载的时间。当用户要下载的时候,反向简析成开始时间,和当前时间做判断即可。<br />算法要简单啊,要不很耗费CPU的,祝你好运了。</div><br />

解决方案

突然发现一个悲催的问题,昨天是在本地测的,实际上文件放在下载服务器上……那给流下载岂不是我们的主机要去读下载服务器上的文件再提供给客户下载?会不会变慢? 会不会变慢,要看网络了。不需要你去读下载服务器。你即然可以给出下载服务器的链接,那下载服务器也应该存在一个web服务。也可以用流的试式请求,但现在不知道你们能不能改下载服务器上的实现。如果不能的话,现在说的都白费了。
解决方案二:
能对你有用就好。 我也很高兴
解决方案三:
下载服务器上的实现。 我的理解是这样,访问的是http://urla/xxxxxxxxxx验证通过后,会在页面上出现。<a href="http://urlB/xxxxxxxxxx">down</a>这样的下载链接,即然是URLB,那么就是向B服务器发送下载请求,而不是在当前的WEB服务器上下载。不知道我理解的对不对。
解决方案四:
同意LS的意见
解决方案五:
文件大的话可以用文件分割的方法下载啊
解决方案六:
2G的试过,4G的没试过
解决方案七:
to:khan 问一下,能判断流是否完成吗?用什么方法?我遇到的情况是这样的,下载时,将流写入response,这里,客户端就会了下载对话框,它是点取消,还是下载超时,还是说拔网线,下载中断。这些都是测试时用的手断,在服务端能得到这样的状态吗?如果能得到,那就太好了。
解决方案八:
你的代码暂时没有想出问题我的建议是不要给出实际的链接,改用流的方式下载。他有请求,到你后做判断,可不可以让他下载。这样来做。无论是这个做法,还是你说出问题的做法,都 有一个问题不可避免,就是网络中断即请求通过了,你是不是要给他计数一次,然后让它下载。如果他出现异外,没有下载完成,估计是再请求也没有用了。处理好这个问题,再用我说的那个办法,我觉得能好一点。
解决方案九:
计次的用户要在代码输出流中做判断,也就是流完成的地方,判断是否下载完成,完成的话做记录。计时的用户这个当然好办了,生成一个可逆的字符串,里面记录允许开始下载的时间。当用户要下载的时候,反向简析成开始时间,和当前时间做判断即可。算法要简单啊,要不很耗费CPU的,祝你好运了。
解决方案十:
1、可以在控件用户数据下载的那张表里加一个字段,可以跟据字段来判断用户可以下载次数,在加一个字段判断用户是否已经下载过2、资源是放在你们的服务器上的,下载也是一个流,并且文件也有大小的,你可以判断一下用户下的流和文件大小进行对比,如果相等,也是就说用户正常完成了下载,对于一次性下载的用户来说,下次就不可能在下载了3、对于你上面的代码没有看出什么太明显的漏洞出来,你可以多找几个测试场景测试一下,多测测总是好的

时间: 2024-10-28 06:49:14

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

SEO不是一个机械重复的工作

现在很多SEO工作人员,都认为SEO不外乎两个工作,一个外链一个内容.SEO工作就是机械化的更新内容,机械化的发布外链.鉴于此,也有很多SEO人员认为SEO就是一个工资不高,又很累的工作. 其实就我这几年接触SEO以来,越来越觉得,SEO其实是一个科学的,系统的工程,而不是重复的机械化劳动.下面就通过几个方面谈谈我的看法. 一.SEO应学会关键词分析 现在很多SEO,一上来想都不想,随便拿了一个关键词就做了起来,于是就造成了,很多网站排名还算可以,流量也还算过得去,但是就是就是接不到什么订单.因

环信Android SDK2.2.5 1月27号出现重复下载server.xml直到StackOverflowError的现象

问题描述 今天抓到部分这样的崩溃, 测试部分未崩溃手机也出现了重复下载的现象, 应该是和网络环境也有一定的关系重复下载的URL是http://www.easemob.com/easemob/server.xml?sdk_version=2.2.5&app_key=***&file_version=​ ,伴随着这么一条LOG retrieveDNSConfigWithCountDown error:Connection to http://www.easemob.com refused这是今

刚毕业进公司一个月很迷茫,忘过来人指点

问题描述 今年刚毕业,大学四年下来基本都是学的非常一般,基本没有项目经验.到大四下学期的时候,刚好自己赚了点钱,就拿去东方标准培训了java,一个月的java基础和2个月的web开发.大学里学的是C++,技术非常一般.不过通过3个月的努力培训,发现IT行业还是有信息跨入的.只是在毕业后找到第一个工作就迷茫了. 当时接到现在这个公司的面试的时候就上网找找公司信息,以及在软件园工作的一个师兄,都说这家公司挺不错的,工作环境很好,在加上笔试面试都通过(其实笔试答的不好),唯一的问题就是自己没经验,都不

ASP:生成一个不重复的随即数字

重复 写这个文章绝对是偶然的偶然的机会,前年等一回的 元旦节,和 老婆上街 溜达,猛然想起买上一张福利彩票,结果 屁都没有中上,开春第一天,就写了个预测彩票中奖的程序,这其中的一个很关键的算法就是如何生成一个不重复的随即数字, 大家看完这个程序以后如果中奖,千万不要忘记豆腐了呀:) Sub CalCaPiao() Dim strCaiPiaoNoArr() As String Dim strSQL As String Dim strCaiPiaoNo As String strCaiPiaoNo

生成一个不重复的随即数字

重复 写这个文章绝对是偶然的偶然的机会,前年等一回的 元旦节,和 老婆上街 溜达,猛然想起买上一张福利彩票,结果屁都没有中上,开春第一天,就写了个预测彩票中奖的程序,这其中的一个很关键的算法就是如何生成一个不重复的随即数字,大家看完这个程序以后如果中奖,千万不要忘记豆腐了呀:)Sub CalCaPiao()Dim strCaiPiaoNoArr() As StringDim strSQL As StringDim strCaiPiaoNo As StringstrCaiPiaoNo = "01,

迅雷一个任务一个任务依次下载怎么设置

  迅雷一个任务一个任务依次下载怎么设置 步骤/方法 打开工具--配置 常用设置--同时进行的最大任务数改成1 在悬浮窗右击开始所有任务 OK,是不是任务一个接一个自动下载了?

多谢多谢-用java编写一个从服务器下载与本地名匹配的文件

问题描述 用java编写一个从服务器下载与本地名匹配的文件 10C 就是一个程序版本与服务器特定路径下所有程序版本匹配,比较高的下载,本地最高关闭程序,现在的卡点就是无法连接FTP,全部是自己看视频学习,从网上查的代码会报错,知识欠缺无法处理登陆问题,还请各位大神不嫌弃悬赏低的帮帮忙,谁都是从菜鸟过来的,我悬赏很少,还要留着不会的再发,希望各位大神帮帮忙,不介意的话留下联系方式方便以后不会的可以帮忙解答,小弟在此感激不尽.谢谢! 解决方案 http://blog.csdn.net/cuiran/

安卓文件上传下载-我是安卓开发学了一点,大家可以给我讲讲如何写一个上传下载的功能

问题描述 我是安卓开发学了一点,大家可以给我讲讲如何写一个上传下载的功能 安卓我是0基础,现在我们老师命令我写一个文件上传下载,可是我只看了那么一点,大家可以给我讲讲思路,自己实际案例 解决方案 首先看看你们老师的要求是上传下载到哪里?然后再搜索方法案例,因为数据存储有多种方式都不一样的 解决方案二: http://download.csdn.net/detail/airlke/8172213

ios开发中能不能用一个app去下载另一个app的安装包并自动安装

问题描述 ios开发中能不能用一个app去下载另一个app的安装包并自动安装 需求:有一个主APP,用来下载其他APP,比如下载完成后自行安装到主APP中(就像插件),然后会产生一个图标,点击这个图标就会启动新安装的APP,当安装这个APP后又返回到主APP中.---------有点像Iphone的桌面. 有没有大神知道类似的实现方法. 解决方案 你看看腾讯的qq农场,其中需要跳转到qq牧场的时候就和你的情况一样,ps:QQ农场和qq牧场是俩app 解决方案二: 一般来说都是跳到APP stor