zoukankan      html  css  js  c++  java
  • 浏览器下载文件时一共发送2次请求,如何把“下载次数”只记录为1次?

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

  • 相关阅读:
    51nod 1087 1 10 100 1000(找规律+递推+stl)
    51nod 1082 与7无关的数 (打表预处理)
    51 nod 1080 两个数的平方和
    1015 水仙花数(水题)
    51 nod 1003 阶乘后面0的数量
    51nod 1002 数塔取数问题
    51 nod 1001 数组中和等于K的数对
    51 nod 1081 子段求和
    51nod 1134 最长递增子序列 (O(nlogn)算法)
    51nod 1174 区间中最大的数(RMQ)
  • 原文地址:https://www.cnblogs.com/qitian1/p/6463119.html
Copyright © 2011-2022 走看看