ユーザーが押すことができる賛成票ボタンがあり、投票が登録されます。このボタンをもう一度クリックすると、投票がキャンセルされます。
したがって、このボタンを押すたびに、データベースへの書き込みが行われます。このボタンでオートクリッカーが継続的に使用されると、継続的な DB 呼び出しが発生します。これを防ぎたい。私に何ができる?
PS。賛成ボタンがクリックされたときに、バックエンド(Djangoを実行)にajaxクエリを送信しています。
ユーザーが押すことができる賛成票ボタンがあり、投票が登録されます。このボタンをもう一度クリックすると、投票がキャンセルされます。
したがって、このボタンを押すたびに、データベースへの書き込みが行われます。このボタンでオートクリッカーが継続的に使用されると、継続的な DB 呼び出しが発生します。これを防ぎたい。私に何ができる?
PS。賛成ボタンがクリックされたときに、バックエンド(Djangoを実行)にajaxクエリを送信しています。
サーバー上でこれを確認したいので、誰かが JavaScript を無効にしても問題ありません。
PHP を使用している場合、1 つのオプションは、投票間に時間制限を設定することです。たとえば、1 分間に 1 票のみを許可します。
したがって、投票ごとに、投票の時間をセッション変数に保存し、制限時間内であれば後続の投票を無視します。
//on vote
$now=date('U');
if(!isset($_SESSION['lastvote']) || $now - $_SESSION['lastvote']<LIMIT){
$_SESSION['lastvote']=$now;
// do database call
}else{
//throw error
}
おそらく最も簡単な方法は、1 つの操作の実行中にボタンを無効にすることです。
これを取得するには、JQuery ajax リクエストを使用して「upvote」/「downvote」メソッドを呼び出すと仮定すると、次のようにするだけです。
$("#upvoteButton").click(function)
{
$("#upvoteButton").attr("disabled");
$.ajax({
url: 'url/upvote.extension',
success: function(data) {
$("#upvoteButton").removeAttr("disabled");
}
});
}
このようにして、単一のリクエストが単一のタブ/ウィンドウごとに送信および解決されます。
簡単な方法:
<button id="upvote" onclick="upvote(this)">Up</button>
<script>
var upvote = function(x){
$(x).removeAttr('onclick'); //if you click this button again, it will do nothing
//call ajax to do something here...
//...............
//after finishing, add attribute onclick to the button
$(x).attr('onclick', 'upvote(this)')
};
</script>
ユーザーが Cookie を受け入れると信じている場合は、クリックをオブジェクト ID とタイムスタンプと共にセッションに保存し、ユーザーが最後の n 秒間に投票ボタンをクリックしたかどうかをテストできます。
また、JavaScript を使用して Web ページの投票ボタンを無効にし、n 秒後に再度有効にして投票を取り消すこともできます。
どちらの提案も、JavaScript 対応または Cookie 対応のブラウザーを使用しているユーザーに依存しています。
URL をサーバーに繰り返し送信するだけのボットを考慮する必要がある場合は、別のアプローチを取る必要があります。たとえば、現在の IP アドレスが最後の n 秒間に URL を呼び出したかどうかを確認し、403 Forbidden http エラーを発生させるか、なにか。
使用できる場合は、setTimeout
次のようなものを試すことができます。
var toggleVote = (function () {
var voted = false,timeout;
return function () {
if( timeout )
clearTimeout(timeout)
voted = !voted
timeout = setTimeout(function() {
console.log("Ajax call - vote : " + voted)
},400)
}
})()
document.getElementById("vote").addEventListener("click",toggleVote)
JSBinの例を次に示します。
"Click me" div をつぶしてみてください