Working log

20190321003 - 이중 요청 차단 처리

까오기 2019. 3. 21. 18:40

시스템이 갑자기 죽어서 로그를 보니 ... 

다운로드를 클릭했는데 아무런 화면의 변화가 없으니 연달아 5번을 클릭했네요. 

하필 그때 또 메모리를 엄청 잡아 먹는 요청이 날아 갔고... 

일단 이중 요청을 막고 요청시 spinner를 보여 주기로 했습니다. 


단순히 이중 요청 막는 것은 간단한 플래그하나 심으면 될 듯합니다.  


1
2
3
4
5
6
7
8
9
10
var isProcess = false;
function doSomething(){
    if(isProcess){
        alert(처리 중입니다. 나중에 다시 하세요");
        return;
    }
    isProcess = true;
    ...
    ...
cs


그런데 ... 

요청의 결과를 알 수가 없습니다. location.href 라니 ... 

1
2
3
function download(){
    location.href="#######";
cs


요청된 페이지에서 완료 시 쿠키를 생성하고 

요청한 페이지에서 1초 간격으로 최대 100초 동안 쿠키를 확인해서 그에 따른 처리를 하도록 했습니다.  


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
var isProcess = false;
var checkCount = 0;
function doSomething(){
    if(isProcess){
        alert("처리 중입니다. 나중에 다시 하세요");
        return;
    }
    // 프로세스 이중 요청 차단
    isProcess = true;
    // 초기화 
    checkCount = 0;
    setCookie("status"""0);
    // 상태 확인 메소드 처리 
    setTimeout(check, 1000);
    // 요청 처리 
    location.href="/test/test";
}
 
function check(){
    var _this = this;
    var status = getCookie("status");
    console.log("status : "+status);
    if(status == "done" || checkCount > 100){
        isProcess = false;
        checkCount = 0;
    }else{
        checkCount ++;
        setTimeout(check, 1000);
    }
 
// 아래는 참고용 
function getCookie(cname) {
    var name = cname + "=";
    var decodedCookie = decodeURIComponent(document.cookie);
    var ca = decodedCookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0== ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name== 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}
 
function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
    var expires = "expires=" + d.toUTCString();
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
cs


서버쪽 처리 

1
2
3
4
        Cookie checkDownloadCookie = new Cookie("status""done"); 
        checkDownloadCookie.setMaxAge(1000000); 
        checkDownloadCookie.setPath("/");  
        response.addCookie(checkDownloadCookie); 
cs


잘 작동합니다. 

끝 ~~~