728x90
728x90
중복요청 방지가 필요한 이유는 중복결제, 같은 내용 추가/등록 등을 막기 위함
jQuery.ajax() 중복요청 처리 방지하기
1
ajax 가 완료되기 전에 다시 클릭하였을 때 해당 요청 진행을 막는 코드
상태 변수를 만들어 전송 유무에 따라 Ajax 요청을 하거나 차단한다.
var isRun = false;
function abcde() {
if(isRun == true) {
return;
}
isRun = true;
$.ajax({
...
}, success : function(datas) {
isRun = false;
...
});
}
2
또는 ajax 세팅 옵션에 async : false를 추가한다. (동기 처리)
동기로 처리하게되면 버튼을 눌러 request 요청을 날렸을 때 response 요청이 올 때까지
다른 request 요청은 받지 않게 되어 중복호출을 방지한다.
async : false;
3
또는 버튼에 클릭 이벤트를 jQuery.bind(), jQuery.unbind() 로 처리해 클릭 이벤트를 bind 시켜놓는다. (클릭의 비활성화) 한 번 클릭시 클릭 이벤트를 unbind 시키고, ajax 요청이 끝나면 다시 bind 시킨다.
$(document).ready(function() {
$('#foo').bind('click', function() {
doSomething();
});
});
var doSomething = function(){
$('#foo').unbind('click');
$.ajax({
type: "POST",
url: "some.do"
}).done(function() {
$('#foo').bind('click', function() {
doSomething();
});
});
}
// 출처: https://javafactory.tistory.com/146 [FreeLife의 저장소]
4
setTimeout() 메소드를 사용하여 중복을 막았다.
// 클릭 후 읽을 부분
if(dontDouble) {
return;
}
dontDouble = true;
//아래는 ajax. success, error function 사이에 넣는다
setTimeout(function() { dontDouble = false; }, 10000);
5
중복처리를 해결할 수 없다면 마지막 success 값만 실행한다.
var ajax_last_num = 0; // 마지막 요청 카운트 저장. 전역변수
// ajax 요청 시작 전 ajax 요청이 들어있는 함수의 지역변수
var current_ajax_num = ajax_last_num;
// ajax 중복요청왔을때 계속 ajax success 코드실행을
// 방지하기 위해 지금 들어온 요청의 카운트 저장
$.ajax({
dataType: "html",
type:'get',
url: url,
beforeSend:function(request){
ajax_last_num = ajax_last_num + 1; // 요청의 마지막 count 를 +1
//요청 전 실행되야할 코드
},
success:function(request){
if(current_ajax_num == ajax_last_num - 1){ // 현 요청이 마지막 요청인지 확인
//성공했을때 동작해야될 코드
}
});
// 출처: https://darammg.tistory.com/5 [다람쥐의 경험들]
6
기타 방법으로는 클릭할 버튼을 disable 시키거나 body 부분 위에 반투명 레이어와 로딩 이미지를 띄우는 jQuery BlockUI 플러그인을 사용하는 방법이 있다.
중복 방지를 위해서 프론트와 벡엔드에서 각각 해야할 것
프론트 JS에서는 preventDefault()나 attr('disabled', true) 등을 사용해서 "버튼 클릭" 직후의 중복 발송처리 방지,백엔드에서는 요청/응답에 타임스탬프를 넣거나 특정 토큰을 발급하거나 하는 방식으로 중복 요청처리 방지. 얼마나 완벽하게 더블서브밋을 방지해야 하느냐에 따라서 로직은 다양
참고하면 좋을 내용
ajax 호출 시 로딩이미지 출력하기
728x90
728x90
'Javascript > JQuery' 카테고리의 다른 글
[문제] jQuery resizable 첫 번째 요소에서만 작동 해결 (0) | 2020.03.19 |
---|---|
jQuery UI, 자바스크립트 라이브러리 (0) | 2020.03.16 |
제이쿼리 textarea 텍스트 입력 영역 비활성화, 활성화 (0) | 2020.02.21 |
선택한 요소 판별해서 value 가져오기 (0) | 2020.02.19 |
jQuery 이벤트 등록 메서드 (단독, 그룹, 강제, 제거, 로딩, 마우스, 키보드) (0) | 2019.12.22 |