浏览器下载文件时一共发送2次请求,如何把“下载次数”只记录为1次?
来源:互联网 发布:2017seo内容编辑软件 编辑:程序博客网 时间:2024/05/16 17:46
最近,个人官网实现了PDF下载功能,出于统计的考虑,增加了“下载次数”download_count这个字段。
但是,我今天突然发现,每次下载download_count都直接+2了。如果服务器发生这种事,还有一定的可能,本地就我一个人下载,怎么可能下载2次。于是,打开了log4j的debug模式,果然执行了2次更新请求。
@RequestMapping(value = "/download/pdf")public void downloadPdf(@RequestParam Integer id, HttpServletRequest req,HttpServletResponse res) {Map<String, Object> article = articleService.get(id);PdfDownload.doDownloadPdfPostWithShuiyin(req, res, article); articleService.plusDownloadCount(id); }
于是,想通过ThreadLocal<Integer> local;这种方式去记录,如果local中有值,表明当前线程已经下载过了,不需要再次更新下载次数。
但事实证明,上述做法不正确,实际现象是次数增加不够“稳定”,有时+1,有时+2。
后来,我又把local中的值,存放ip,判断是否为null,或者2次请求ip是否相同,结果仍然不够“稳定”。
--------------------------------------------------------
在实践过程中,我的一些“误解”:
1.下载文件,浏览器只会发送1次请求。实际是2次,毫无疑问。
2.发送2次请求,是同一个线程响应。我想当然的认为这2次请求,都是服务于“同一次下载”。
事实证明,我太天真。
3.由于觉得这2次请求,我认为使用ThreadLocal存放个值,表明当前线程已经下载过了。
事实证明,这不科学。2次请求,2个不同的线程响应。
4.“2次请求,2个不同的线程响应。”理论上是这样。
但我们Team在做公司项目的时候,遇到了类似的问题。Boss后来想起来,Tomcat的线程是用“线程池” 实现的。
多次请求可能是同一个线程处理,也可能是多个。
这一点,和实际发生的“更新次数不稳定” 非常吻合。
5.下载文章A,次数更新。下载文章B、C、D,次数都不再更新。
这个不符合我的设想,原因是:下载没有比较文章的ID,不同文章的下载次数应该是相互独立的。
--------------------------------------------------------
现在有2个问题:
1.我就想实现自己最初的想法。
浏览器发送2次请求,下载次数更新了2次。能不能只让它更新一次了,从而准确地体现下载次数!!!
这个我目前还没有想到好的方法。
2. 改变需求,一个用户在一定时期内,下载一篇文章,无论多少次,都只算一次。
下载不同的文章,次数应该且只应该增加1次。
我的想法:
建立一个存放已经下载的队列,用户的ip和文章的id共同作为key。
用户下载一次,就把用户IP和文章ID 共同组成的key,存放到队列里。
当来了新的下载请求时,从队列中查找,是否已经存在key,如果不存在,才+1.否则,不更新次数。
原文首发:http://fansunion.cn/article/detail/141.html
- 浏览器下载文件时一共发送2次请求,如何把“下载次数”只记录为1次?
- ASIHTTPRequest请求时,发送了2次请求问题解决
- 非IE浏览器 img标签 src值为空时,2次请求问题
- easyui tabs href请求 IE浏览器请求发送2次 火狐正常
- 发送post请求下载文件
- 关于按次下载
- 下载一个指定文件,下载成功后修改权限,自动重试60次,带详细日志记录。
- 把当前文件中的所有文本拷贝,存入一个txt文件,统计每个字符出现的次数并输出例如: a: 21 次 b: 15 次 c:: 15 次 把: 7 次 当: 9 次 前: 3 次
- fork没有返回2次,它只返回1次
- 如何只使用一条语句实现x是否为2的若干次幂的判断
- IOS开发之——ASIHTTPRequest请求时,发送了2次请求问题解决
- IOS开发之——ASIHTTPRequest请求时,发送了2次请求问题解决
- js发送post请求下载文件
- 如何实现文件下载的次数统计?
- 只为下载教程
- 只为下载视频教程
- xml文件浏览器点击显示为下载
- 如何找出数组中出现次数为奇数次的唯一元素
- JAVA - 类和对象
- re---Python的正则表达式模块
- JAVA中开闭原则-----对扩展开放, 对修改关闭。以及接口隔离原则的强大
- 技术的未来,迷茫和选择
- 内核空间和用户空间
- 浏览器下载文件时一共发送2次请求,如何把“下载次数”只记录为1次?
- 自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明
- 利用wampsever自定义网站根目录
- Android :task 与 back stack解读之初步了解.(包括 task,back stack,lauchMode, taskAffinity ,intent flags等解析)
- 堆排序
- DedeCms 万能安全防护代码
- 打包
- RISC与CISC指令集的区别
- 到现在为止看的最全的一篇关于介绍XMPP的文章(1)