브라우저에서 파일을 다운로드할 때 총 2회의 요청을 보내는데 어떻게'다운로드 횟수'를 1회로 기록합니까?

최근 개인 홈페이지에서 PDF 다운로드 기능을 실현하였으며, 통계적인 고려에서 다운로드 횟수를 증가시켰습니다.download_count 이 필드.그런데 오늘 갑자기 다운받을 때마다카운트가 바로 +2예요.만약 서버에 이런 일이 발생한다면 현지에서는 나 혼자 다운로드할 수 있는데 어떻게 두 번 다운로드할 수 있겠는가.그래서log4j의 debug 모드를 열었는데 과연 두 번의 업데이트 요청을 실행했습니다.    
@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);  
    }

그래서 ThreadLocallocal을 통해이런 방식으로 기록합니다. 만약local에 값이 있다면 현재 라인이 다운로드되었음을 나타냅니다. 다운로드 횟수를 다시 업데이트할 필요가 없습니다.그러나 사실은 상술한 방법이 정확하지 않다는 것을 증명한다. 실제 현상은 횟수 증가가 안정적이지 못하고 때로는 +1, 때로는 +2이다.나중에 나는local의 값을 ip에 저장하여null인지 아닌지, 또는 2차 요청 ip가 같은지 판단하였는데, 결과는 여전히 안정적이지 못했다.실천 과정에서 나의 몇 가지 오해: 1.파일을 다운로드하면 브라우저에서 요청이 한 번만 전송됩니다.실제로는 두 번, 의심의 여지가 없다.2. 요청을 두 번 보내면 같은 스레드 응답입니다.나는 당연히 이 두 번의 요청이 모두'같은 다운로드'에 서비스된다고 생각한다.사실은 내가 너무 천진하다는 것을 증명한다.3. 이 두 번의 요청으로 인해threadLocal을 사용하여 값을 저장하면 현재 라인이 다운로드되었다고 생각합니다.사실이 증명하듯이 이것은 과학적이지 않다.두 번의 요청, 두 개의 다른 스레드 응답.4. "2회 요청, 2개의 다른 스레드 응답."이론적으로는 이렇다.하지만 우리 팀은 회사 프로젝트를 하면서 비슷한 문제에 부딪혔다.보스는 나중에 Tomcat의 스레드는'스레드 탱크'로 이루어진 것이라고 생각했다.여러 번 요청은 같은 스레드 처리일 수도 있고 여러 개일 수도 있습니다.이 점은 실제 발생한'업데이트 횟수 불안정'과 매우 일치한다.5. 기사 A 다운로드, 횟수 업데이트.기사 B, C, D를 다운로드하면 더 이상 업데이트되지 않습니다.이것은 나의 구상에 부합되지 않는다. 왜냐하면 다운로드는 비교 문장의 ID가 없고 서로 다른 문장의 다운로드 횟수는 서로 독립적이어야 하기 때문이다. 
현재 두 가지 문제가 있습니다.나는 나의 최초의 생각을 실현하고 싶다.브라우저가 요청을 두 번 보내고 다운로드 횟수가 두 번 업데이트되었습니다.한 번만 업데이트해서 다운로드 횟수를 정확하게 보여줄 수 있을까!!!이것은 나는 아직 좋은 방법을 생각하지 못했다.2. 수요를 바꾸면 한 사용자가 일정 기간 동안 한 편의 글을 다운로드하면 몇 번이든 한 번만 계산한다.다른 글을 다운로드하는 횟수는 1회로 늘려야 한다.내 생각: 다운로드한 대기열을 저장하고 사용자의 IP와 글의 id를 키로 공유합니다.사용자가 한 번 다운로드하면 사용자 IP와 글 ID로 구성된 키를 대기열에 저장합니다.새 다운로드 요청이 왔을 때, 대기열에서 키가 이미 존재하는지, 존재하지 않으면 +1입니다.그렇지 않으면 업데이트 횟수가 없습니다.
원문 첫머리:http://fansunion.cn/article/detail/141.html

좋은 웹페이지 즐겨찾기