Я хочу создать фильтр для моих действий добавления, обновления и удаления в моих контроллерах, чтобы автоматически проверять, были ли они
- вызваны в POST, в отличие от GET или какого-либо другого метода
- и имеют идентификаторы pageInstanceID, которые я установил в формах на своих представлениях
- защищает от xss
- защищает от двойной отправки формы
- от кнопки отправки doubleнажмите
- с кнопки «Назад», нажатой после отправки
- с URL-адреса, сохраняемого или добавленного в закладки
В настоящее время ярасширенный \ lithium \ action \ Controller с помощью AppController и мои действия добавления, обновления и удаления, определенные там.У меня также есть логическая функция в моем AppController, которая проверяет, находятся ли соответствующие pageInstanceID в сеансе или нет.
Ниже мой код:
public function isNotPostBack() {
// pull in the session
$pageInstanceIDs = Session::read('pageInstanceIDs');
$pageInstanceID = uniqid('', true);
$this->set(compact('pageInstanceID'));
$pageInstanceIDs[] = $pageInstanceID;
Session::write('pageInstanceIDs', $pageInstanceIDs);
// checks if this is a save operation
if ($this->request->data){
$pageInstanceIDs = Session::read('pageInstanceIDs');
$pageIDIndex = array_search($this->request->data['pageInstanceID'], $pageInstanceIDs);
if ($pageIDIndex !== false) {
// remove the key
unset($pageInstanceIDs[$pageIDIndex]);
Session::write('pageInstanceIDs', $pageInstanceIDs);
return true;
}
else
return false;
} else {
return true;
}
}
public function add() {
if (!$this->request->is('post') && exist($this->request->data())) {
$msg = "Add can only be called with http:post.";
throw new DispatchException($msg);
}
}
Затем в моих контроллерах я наследую от AppController иВыполните действие следующим образом:
public function add() {
parent::add();
if (parent::isNotPostBack()){
//do work
}
return $this->render(array('layout' => false));
}
, который обеспечит, чтобы форма использовала POST и была , а не дважды отправлена (кнопка возврата или щелчок счастливыми пользователями).Это также помогает защитить от XSS.
Я знаю, что для этого есть плагин, но я хочу реализовать его в качестве фильтра, чтобы методы моего контроллера были чище.Выполненный таким образом, единственный код в моих действиях - это рабочая часть // do и оператор return.