3

我有一个投票按钮,用户可以按下它,投票就会被登记。再次单击此按钮时,投票将被取消。

因此,每次按下此按钮都在执行数据库写入。如果在此按钮上连续使用自动点击器,则会发生连续的 DB 调用。我想防止这种情况。我能做些什么?

PS。单击 upvote 按钮时,我正在向后端(运行 Django)发送 ajax 查询。

4

5 回答 5

3

你真的想在服务器上检查这个,所以如果有人禁用 javascript 也没关系。

如果您使用 PHP,一个选项是设置投票之间的时间限制。例如,每分钟只允许一票。

因此,在每次投票时,将投票时间存储在会话变量中,如果在时间限制内,则忽略后续投票:

//on vote
$now=date('U');
if(!isset($_SESSION['lastvote']) || $now - $_SESSION['lastvote']<LIMIT){
    $_SESSION['lastvote']=$now;
    // do database call

}else{
    //throw error
}
于 2012-12-18T09:29:19.960 回答
1

可能最简单的方法是在运行单个操作时禁用按钮。

要获得这一点,假设您使用 JQuery ajax 请求来调用“upvote”/“downvote”方法,您只需:

$("#upvoteButton").click(function)
{
    $("#upvoteButton").attr("disabled");
    $.ajax({
      url: 'url/upvote.extension',
      success: function(data) {
        $("#upvoteButton").removeAttr("disabled");
      }
    });
}

这样,每个选项卡/窗口都会发送和解析单个请求。

于 2012-12-18T09:21:38.877 回答
0

如果您相信您的用户接受 cookie,您可以将点击连同对象 ID 和时间戳一起存储在会话中,并测试用户是否在最后 n 秒内点击了投票按钮。

您也可以使用 javascript 禁用网页上的投票按钮,并在 n 秒后再次启用以撤销投票。

这两个建议都取决于使用启用 javascript 或启用 cookie 的浏览器的用户。

如果您必须考虑机器人只是将 url 重复发送到服务器,您需要采取不同的方法 - 例如检查当前 ip 地址是否在过去 n 秒内调用了 url 并引发 403 Forbidden http 错误或某物。

于 2012-12-18T09:18:43.717 回答
0

如果你可以使用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

于 2012-12-18T09:27:47.530 回答
0

简单的方法:

<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>
于 2015-11-19T15:56:21.040 回答