Какие методы доступны для остановки нескольких обратных передач формы в ASP.NET MVC? - PullRequest
20 голосов
/ 20 мая 2009

Распространенная веб-проблема заключается в том, что пользователь нажимает кнопку отправки формы несколько раз, поэтому сервер обрабатывает форму более одного раза. Это также может произойти, когда пользователь нажимает кнопку «Назад», отправив форму, и она снова обрабатывается.

Каков наилучший способ предотвратить это в ASP.NET MVC?

Возможности, как я вижу это:

  1. Отключить кнопку после отправки - это обходит несколько кликов, но не навигацию
  2. Немедленно перенаправьте получающее действие - браузеры, похоже, исключают эти перенаправления из истории
  3. Поместите уникальный токен в сеанс и форму - если они совпадают, обработайте форму - если не очистите форму для новой отправки

Есть еще?

Существуют ли какие-либо конкретные реализации любого из них?

Я вижу третий вариант, реализуемый как ActionFilter с расширением HtmlHelper, аналогично тому, как это делается для защиты от подделки.

С нетерпением жду ваших отзывов от MVC.

Ответы [ 6 ]

16 голосов
/ 20 мая 2009

Часто люди упускают из виду самый обычный способ справиться с этим, который заключается в использовании одноразовых ключей .

Вы можете использовать PRG , как уже упоминали другие, но недостатком PRG является то, что он не решает проблему двойного щелчка, он требует дополнительной поездки на сервер для перенаправление, и поскольку последний шаг - это запрос GET, у вас нет прямого доступа к только что опубликованным данным (хотя они могут быть переданы в качестве параметра запроса или поддерживаться на стороне сервера).

Мне нравится решение Javascript, потому что оно работает большинство времени.

Nonce keys однако, работают все время. Одноразовый ключ - это случайный уникальный GUID, сгенерированный сервером (также сохраненный в базе данных) и встроенный в форму. Когда пользователь помещает POST в форму, одноразовый ключ также публикуется. Как только POST приходит на сервер, сервер проверяет, существует ли одноразовый ключ в его базе данных. Если это так, сервер удаляет ключ из базы данных и обрабатывает форму. Следовательно, если пользователь выполняет POST дважды, второй POST не будет обработан, так как одноразовый ключ был удален после обработки первого POST.

Дополнительный ключ имеет дополнительное преимущество в том, что он обеспечивает дополнительную безопасность, предотвращая повторных атак (человек посередине прослушивает ваш HTTP-запрос и затем передает его на сервер, который рассматривает его как законный) .

5 голосов
/ 20 мая 2009

Вы всегда должны возвращать перенаправление как HTTP-ответ на POST. Это предотвратит повторное появление POST, когда пользователь перемещается назад и вперед с помощью кнопок «Вперед / Назад» в браузере.

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

2 голосов
/ 20 мая 2009

Возможно, вы захотите взглянуть на шаблон Post-Redirect-Get (PRG):

1 голос
/ 20 мая 2009

Это действительно не специфично для MVC, но шаблон, который мы используем на наших веб-страницах, заключается в том, что действия выполняются с вызовами AJAX, а не с полностраничными POST. Поэтому переход по URL никогда не выполняет никаких действий, а только отображает форму. Вызов AJAX не будет в истории

0 голосов
/ 24 июля 2013

Самым элегантным решением, которое я нашел, было использование ActionFilters:

Сообщение в блоге здесь

0 голосов
/ 20 мая 2009

Наряду с отключением кнопок, вы можете добавить прозрачный div на всю веб-страницу, чтобы щелчок ничего не делал. Мы делаем это на моей работе и добавляем небольшой дружелюбный ярлык с надписью «Обработка запроса».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...