谁一开始就是大神?

关于服务器端防止短时间内重复提交的问题[2.0]

大家好,测试了一天,实际收效甚微。
具体controller如下。

public function actionCreate() {
    $session = Yii::$app->session;
    $sessionKey = Yii::$app->user->id . '.issending';
    Yii::warning(isset($session[$sessionKey]));
    if (!isset($session[$sessionKey])) {
        $session[$sessionKey] = microtime();
        Yii::warning($session[$sessionKey]);
        $model = new book();
        $model->load(Yii::$app->request->post());
        if ($model->save()) {
            \Yii::$app->getSession()->setFlash('info', '新增完成');
        } else {
            \Yii::$app->getSession()->setFlash('error', '新增失败');
        }
    }
    unset($session[$sessionKey]);
    $this->redirect(['index']);
}

作用是来防止段时间内重复提交的。

但是在我在前台 快速双击 提交按钮后,依然会产生2(或实际点击次数)条一样的数据
日志文件中 因为 Yii::warning(isset($session[$sessionKey])); 查产生的内容 全部为false。

客户端的js屏蔽按钮,已经实现(本测试中取消了屏蔽用来模拟客户端屏蔽js的情况)。
model部分unique的规则也已实现。(本测试中取消了unique规则,模拟实际上确实容许重复的情况)
不知道大家是否有什么好的方法,来避免重复提交。

谢谢大家。

可能的原因是unset($session[$sessionKey]);在你的第二次POST请求到达之前就执行了,所以session机制不好使。如果在不用unique规则、不用table的key冲突、也不用js屏蔽button的前提下,想在服务器端避免重复insert,可以在book中重载ActiveRecord的beforeSave方法,在里面查重,根据情况返回true/false。
表示我也遇到这中问题

赞(0) 打赏
未经允许不得转载:菜鸟之家 » 关于服务器端防止短时间内重复提交的问题[2.0]

评论 抢沙发

登录

找回密码

注册