我有一个投票按钮,用户可以按下它,投票就会被登记。再次单击此按钮时,投票将被取消。
因此,每次按下此按钮都在执行数据库写入。如果在此按钮上连续使用自动点击器,则会发生连续的 DB 调用。我想防止这种情况。我能做些什么?
PS。单击 upvote 按钮时,我正在向后端(运行 Django)发送 ajax 查询。
我有一个投票按钮,用户可以按下它,投票就会被登记。再次单击此按钮时,投票将被取消。
因此,每次按下此按钮都在执行数据库写入。如果在此按钮上连续使用自动点击器,则会发生连续的 DB 调用。我想防止这种情况。我能做些什么?
PS。单击 upvote 按钮时,我正在向后端(运行 Django)发送 ajax 查询。
你真的想在服务器上检查这个,所以如果有人禁用 javascript 也没关系。
如果您使用 PHP,一个选项是设置投票之间的时间限制。例如,每分钟只允许一票。
因此,在每次投票时,将投票时间存储在会话变量中,如果在时间限制内,则忽略后续投票:
//on vote
$now=date('U');
if(!isset($_SESSION['lastvote']) || $now - $_SESSION['lastvote']<LIMIT){
$_SESSION['lastvote']=$now;
// do database call
}else{
//throw error
}
可能最简单的方法是在运行单个操作时禁用按钮。
要获得这一点,假设您使用 JQuery ajax 请求来调用“upvote”/“downvote”方法,您只需:
$("#upvoteButton").click(function)
{
$("#upvoteButton").attr("disabled");
$.ajax({
url: 'url/upvote.extension',
success: function(data) {
$("#upvoteButton").removeAttr("disabled");
}
});
}
这样,每个选项卡/窗口都会发送和解析单个请求。
如果您相信您的用户接受 cookie,您可以将点击连同对象 ID 和时间戳一起存储在会话中,并测试用户是否在最后 n 秒内点击了投票按钮。
您也可以使用 javascript 禁用网页上的投票按钮,并在 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的例子
尝试捣碎“点击我” div
简单的方法:
<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>