【发布时间】:2012-02-13 18:12:37
【问题描述】:
我正在构建一个模型视图控制器 Web 应用程序,我想构建一个请求垃圾邮件机制,为什么?让我简单解释一下:
我们自己有一个 ajax 控制器,每个用户输入都是通过 ajax 接收的,在我的 Web 应用程序中没有直接执行 $_POST。
让我们想象一下 Ajax 控制器的一些操作,我们希望在其中设置垃圾邮件预防机制:
class AjaxController{
private function setPrevention($interval){
$latestActionRequest = $_SESSION['requests'][$this->action];
if($prevention === null){
$_SESSION['requests'][$this->action] = array('latest' => microtime(), 'interval' => $interval
} else {
// Calc difference here, and check if the interval was within range, else
// the user was requesting the action method to quickly.
}
}
public function _postComment(){
$this->setPrevention(1000);
// Apply validation, on the $_POST array, insert the to database.
}
}
所以我们有一个发表评论的动作,我们只想让用户每秒发表评论,所以我们在会话中应用了一个非常基本的预防机制。
检查 setPrevention 方法中的注释。我有两个问题,我的第一个问题是,这种机制是个好主意吗?还是有其他更好的方法来构建它?
第二个问题是,如何检查最新的请求是否在区间范围内?和 microtime - microtime 我得到了以秒为单位的差异,但有些操作我想应用 500 毫秒的间隔。
到目前为止我得到了什么:
$_SESSION['requests']['postComment'] = array('latest' => microtime(true), 'interval' => 1000);
$difference = ($_SESSION['requests']['postComment'] - microtime(true));
此时 $difference 会返回 float(106.984388113) (等待 106 秒) 但是我们想要得到微时差,因为我们的间隔是 1000(这是 1 秒而不是 1000)
希望我的问题很清楚,感谢您的帮助。
【问题讨论】:
-
修改了我对您的编辑的回答。