最近,个人官网实现了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

转载于:https://www.cnblogs.com/qitian1/p/6463120.html

浏览器下载文件时一共发送2次请求,如何把“下载次数”只记录为1次?相关推荐

  1. 浏览器下载文件时,总是中断然后重头开始重复下载的解决办法

    1. 问题: 最近使用chrome浏览器下载较大的文件时,下载过程中总是下载一部分后又重新下载,而且一直重连下载. 搜索解决方案 比如: 下载文件过程中遇见下载一半重新下载,而且一直重连下载 说是因为 ...

  2. 去掉下载文件时的提示“IE已阻止从此站点下载文件到您的计算机”

    1.在IE工具栏点击"工具"菜单栏下的"INTERNET选项" 点击弹出窗口的"隐私"选项卡,去掉"打开弹出窗口阻止程序" ...

  3. 解决浏览器下载文件时中文文件名乱码的问题

    解决浏览器下载文件时中文文件名乱码的问题 很多时候我们需要在后台为前端提供文件下载的功能,但是当文件名中有中文时我们不能直接将文件名返回,需要对中文的文件名进行处理后再返回. 一.文件下载contro ...

  4. 火狐浏览器下载文件时文件名乱码问题的解决

    火狐浏览器在微信网页版或其他网站中下载文件时,存在文件名乱码的问题,搜索了很多解决办法,写的都比较复杂,不适合我这种不懂代码的人.后来发现火狐浏览器附加组件addons上可以搜到解决此问题的组件,就是 ...

  5. 下载文件时,文件名乱码。

    Unicode网页中上传下载文件时发生文件名乱码的问题 最 近有一个需要支持unicode的项目在上传和下载文件时遇到文件名乱码问题. 项目背景, 这个项目关键之处在于需要支持unicode以及支持M ...

  6. 处理下载文件时中文乱码

    /** * 下载文件时,针对不同浏览器,进行附件名的编码 * @param filename 下载文件名 * @param agent 客户端浏览器(通过request.getHeader(" ...

  7. java下载文件时文件名中文乱码

    下载文件时中文乱码是一个很常见的问题, 这不是第一次,但我希望它是最后一次了 这是个让人很头疼的问题, 明明在后台文件名还是正常的,为什么下载后文件名就乱码了呢 为什么会乱码:因为浏览器的编码和后台传 ...

  8. 下载文件时设置文件名的方法

    在阿里云云存储OSS中下载文件时设置文件名的办法: import java.io.File; import java.io.FileInputStream; import java.io.IOExce ...

  9. Firefox下载文件时中文名乱码问题

    为了形象化,先看几张不同浏览器下下载文件时的效果图: 1:Firefox 36.0.1 很明显在Firefox下出现了乱码,出现乱码一般是字符集的问题,这是怎么回事呢?为什么其他的浏览器都没有问题呢? ...

最新文章

  1. Splay ---- 文艺平衡树区间翻转的建树模式
  2. 洛谷4147:玉蟾宫——题解
  3. HTML 中的marquee标签详解
  4. premiere pr 波纹编辑 滚动编辑 比率拉伸 工具使用
  5. 将数组存入mysql数据库,将数组值写入mysql数据库
  6. ajax向服务端发送请求验证用户名是否可用小示例
  7. 【人工智能】AI如何把招人效率提高四成
  8. 绘图解谜:公钥、私钥、证书
  9. python中合并列表_关于python:如何将两个列表合并到一个列表中?
  10. 配置rsync同步+inotify实时监控
  11. 发电机机房设计规范_柴油发电机的容量选择,以及柴油发电机机房设计规范要求!...
  12. iOS非越狱自动化脚本的方案
  13. JAVA获取本机IP地址
  14. ppi 各代iphone_各代iPhone逻辑分辨率与物理分辨率
  15. BASH脚本基础:环境变量PS1配色方法
  16. Freebase调研(持续更新中)
  17. 手把手带你 Unity 入门之从零创建一个时钟(GameObjects 与 Scripts)
  18. 犹他州计算机科学,犹他州大学计算机科学computer science专业排名第201~250名(2020THE泰晤士高等教育世界大学排名)...
  19. 数字图像处理作业文档整合
  20. Windows 安装MySQL 8.0 超详细教程(mysql 8.0.30)

热门文章

  1. 人工蜂群算法的最小搜索模型_【优化求解】人工蜂群ABC算法
  2. Nginx 502 Bad Gateway 自动重启脚本
  3. UI设计师遇到瓶颈如何自我提升?
  4. 最强自定义PHP集成环境,系统缺失dll和vc也能正常运行
  5. 5G时代的无线宽带新技术
  6. PowerShell 开启无线热点
  7. hdu 2438 Turn the corner [ 三分 ]
  8. SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查
  9. 苹果se2_搜狗输入法适配苹果se2,给用户带来新玩法。
  10. python 复制列表内容_Python复制列表列表