2016-06-21 8 views
3

私は現在、いくつかのAjaxコードで遊んでいます。私はこのシナリオを試してみて、あなたの専門家が解決策を提示できるかどうかを確認するために問題をミラーリングします。ありがとうございます。AjaxとJavaScript |ユーザーによってトリガーされたリクエストを制限する

シナリオ:<p onclick="ajax_call();">Click</p>

私はそうのようなHTMLのボタンを持っています。これは、その後php_scriptファイルにいくつかのPHPコードを実行し

function ajax_launch(){ 
    xmlhttp = new XMLHttpRequest(); 
    xmlhttp.onreadystatechange = ajax_launch_callback; 

    xmlhttp.open("POST", "/php_script", true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlhttp.send(); 
} 

function ajax_launch_callback(){ 
    if(xmlhttp.readyState==4 && xmlhttp.status==200){ 
     // code to do something once response is here successfulyl 
    } 
} 

をして$output

問題返します:このボタンをクリックすると、それはこのようにPHPのページにAJAX要求を起動します

をAJAX経由で呼び出されるphp_scriptページは静かで重く、いくつかのAPIとデータベース呼び出しによってページが読み込まれるのが「遅い」(これは完璧です)。しかし、現時点では、ページが応答を待っている間(まだPHPを実行していて、何も返されていない)、ユーザーは技術的にボタンをスパムして多くのajax呼び出しを開始できます。理想的には、これは単にサーバーに負荷をかけるだけで、要求が保留され、戻ってこないと、それ以上の要求はできません。

どうすればこのようにすることができますか?あなたのソリューションを楽しみにして事前に

おかげで、/相談ALSO

:複数の要求によって

、これは私が何を意味するかである - 私はいくつかの要求を起動するボタンをクリックしてスパムときの写真を見ます最初のものは行われていない一方で(まだ何も返されません):

Image of chrome debugger (networks tab)

+0

http://stackoverflow.com/questions/10276784/jquery-limit-the-number-of-simultaneous-ajax-requests。最後の2人の回答を確認してください –

+1

リクエストの進行中に、ロードアイコン付きのボタンをマスクしてください。ユーザーに何かが起こっていることを知らせる – charlietfl

+0

私はこれを行う最善の方法はPHPでチェックをすることです。 – 0x58

答えて

1

あなたはこれを試すことができます。

var xmlhttp; 
function ajax_launch() { 
    if (xmlhttp && xmlhttp.readyState == 4 || !xmlhttp) { 
     xmlhttp = new XMLHttpRequest(); 
     xmlhttp.onreadystatechange = ajax_launch_callback; 

     xmlhttp.open("POST", "/php_script", true); 
     xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     xmlhttp.send(); 
    } 
} 

function ajax_launch_callback() { 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
     // code to do something once response is here successfulyl 
    } 
} 
+0

これは、宣言する前にxmlhttpから読み取ろうとしているので、参照エラーがスローされます。 – Quentin

+0

@Quentinは宣言を追加しました。私はそれがポストではないコードにあったと仮定しました。 – jcubic

+0

しかしそれはJSなので、ユーザーは単にそれを変更したり、自分のjs呼び出しを作成することはできますか? –

2

ここで言及したJavaScriptソリューションとリンクされた質問には素晴らしい機能がありますが、スパマーは必ずしもブラウザを使用していない可能性があり、JavaScriptが無効になっている可能性があります。

サーバー上でセッションを使用すると、要求が処理されているときにセッションがロックされるため、一度に1ユーザーにつき1つの要求しか処理しません。しかし、リクエストはキューに入れられます(つまり、ネットワークのタブデータに表示されるものでしょうか?)ので、たとえばIPアドレスなどのレート制限でそれを補うことができます。

+0

このレート制限について説明できますか?あなたの言ったこととまったく同じですが、私のネットワークタブに表示されているようにリクエストが行われますが、これは問題ではありませんか?私はそれを見て、それは余分なアヤックスコールです。 –

+0

@FlyingPheonixたとえば、訪問者のIPアドレスを取得し、タイムスタンプを付けたデータベースにログインし、最後のxx秒または分からすでに存在するエントリの数を確認することができます。 – jeroen

0

この事は役に立つかもしれません:

#screenblocker { 
    position:absolute; 
    left:0px; 
    top:0px; 
    right:0px; 
    bottom:0px; 
    background-color:#ffffff; 
    opacity:0.4; 
    filter:alpha(opacity=40); 
    z-index:9999999; 
} 

、スクリプト部分:

<div style="display: none;" id="screenblocker">&nbsp;</div> 

そして、このスタイルこのHTMLを追加AJAX呼び出した後

var e = document.getElementById('screenblocker'); 
    if (e != null) { 
     e.style.display = 'block'; 
     setTimeout("document.getElementById('screenblocker').style.display = 'none';", 5000);//considering 5 seconds to load, you can block longer if needed 
    } 

とAjaxの成功に:

document.getElementById('screenblocker').style.display = 'none'; 
関連する問題