Intereting Posts
В PHP, почему </ script> не показывает ошибку синтаксического анализа? Соответствие и удаление твитер хэштегов в строке Лучшая практика: как структурировать массивы – стандарты и соглашения об именах Дата истечения срока действия PHP SSI включен в PHP, поскольку шаблон не работает Можно ли определить DNS-сервер посетителя? TokenMismatchException в строке VerifyCsrfToken.php 67 при загрузке видео прокручивать базу данных и показывать в таблице Закрытие строки двойными кавычками Является ли хорошей практикой отправлять изображения в строке base64 с android на PHP? Каковы «стандартные» сокращения часового пояса? Laravel Eloquent – использование идентификатора сводной таблицы в качестве внешнего ключа в другой таблице php DOMDocument добавляет заголовки <html> с объявлением DOCTYPE PHP не отображает результат запроса MYSQL Как очистить кештекст php без перезапуска Apache или изменить домен?

Как предотвратить получение двойных / дублированных форм в CakePHP?

Я обнаружил, что компонент безопасности в CakePHP помогает предотвратить CSRF, добавляя токены в виде скрытых значений в формы.

Мне было интересно, если бы все-таки было запрещено дублировать формы, используя этот компонент или какой-то другой компонент / помощник?

В предыдущих проектах я использовал уникальный хеш, сохраненный в сеансе, который затем считывается после отправки. Повторная подача будет иметь тот же самый хеш, и будет произведена ошибка.

благодаря

Related of "Как предотвратить получение двойных / дублированных форм в CakePHP?"

Вы могли бы реализовать те же самые вещи в Cake, как вы это делали раньше.

В представлении установите переменную сеанса, которая отмечает, что форма была отправлена. Удостоверьтесь, что после него истекает срок действия (в течение нескольких секунд следует сделать трюк). Если переменная сеанса присутствует при обработке формы (и вы находитесь в пределах этого срока действия), то у вас есть повторная отправка, поэтому не сохраняйте данные формы.

Я бы рекомендовал сделать это в методе save (..) вашей модели, поэтому вам не нужно беспокоиться о его добавлении в нескольких местах кода.

В компоненте безопасности CakePHP 2.x есть функция, позволяющая вам либо использовать один и тот же токен безопасности до истечения срока его действия, либо только один раз. Поместите это в свои контроллеры beforeFilter:

$this->Security->csrfUseOnce = true; 

Найти больше информации здесь

@DoctorFox уже ответил на это с помощью csrfUseOnce = true , но это бросит вас в csrfUseOnce = true , которые вам все равно придется управлять. Итак, полное решение для меня:

 class YourAppController extends AppController { public $helpers = array('Html', 'Form'); public $components = array('Security'); public function beforeFilter() { $this->Security->csrfUseOnce = true; $this->Security->blackHoleCallback = 'blackhole'; } public function blackhole($type) { $this->redirect(array('action' => 'index')); } 

Если переадресация отсутствует, вы по-прежнему открыты для подачи двойной формы.

Ссылка: компонент безопасности CakePHP

Просто сделайте рисунок PRG. Это очень просто! Ну, по крайней мере, это то, что все говорят, но никто не дает четкого ответа! Мне потребовалась неделя поиска и копания, а затем «Новичок» решил сделать что-то самостоятельно! Вот один из способов сделать это в cakephp (я использую 2.0.5):

Независимо от кода здесь есть логика в шагах:
1- заданные данные
2- подтвердить (еще не создавать ())
3- записать $ this-> request-> данные в переменную сеанса
4- перенаправление на действие saveData

Внутри saveData:
5- чтение и сохранение переменной сеанса
6 – переменная сеанса DELETE
7- create ()
8 – сохранение данных в модели
9-перенаправление

Вот пример того, как выглядит ваш код.
** Attn: " ourController " и " ourModel "

 public function add() { if ($this->request->is('post')) { if (isset($this->request->data)) { $this->ourModel->set($this->request->data); if ($this->ourModel->validates()) { $this->Session->write('myData', $this->request->data); $this->redirect(array('controller' => 'ourController', 'action' => 'saveData', 'ourModel' //optional but recommended ) ); } else { $this->Session->setFlash('ourModel could not be saved.'); } } .....//the rest of add() function } 

Затем вам нужно перенаправить (при проверке) на эту функцию, которая перенаправляет вас снова на действие индексации или везде, где ваша логика вас принимает!

 public function saveData($model) { $myData = $this->Session->read('myData'); $this->Session->delete('myData'); //extremely important $this->$model->create(); if ($this->$model->save($myData)) // or $myData[$model] if you are dealing with multiple models { $this->Session->setFlash(__($model.' have been saved successfully')); $this->redirect(array('controller' => 'ourController', 'action' => 'index' ) ); } } else{ $this->Session->setFlash(__($model.' could not be saved')); } } } 

Простая самопереадресация может работать, но в большинстве случаев вы хотите перенаправить на другое представление (например, в другую форму или в индексный вид)

Я надеюсь, что эта разработка поможет сэкономить время на других, чтобы не тратить целую неделю (как в моем случае), чтобы сделать такую ​​функциональность на стороне сервера!

Не знаю о торте, но не пытайтесь отображать контент в запросе POST, делайте самостоятельную переадресацию. Двойная почта будет решена.

Компонент Security должен работать, кроме того, вы можете также отключить данные сразу после публикации:

 unset($this->data['yourModel']); 

Я включил событие onClick, которое отключает эту кнопку:

 <?= $this->Form->button('Salvar', [ 'value' =>'Submit', 'onClick' => 'form.submit();this.disabled=true' ]) ?>