2009-05-20 3 views
20

Общей проблемой в Интернете является то, что пользователь нажимает кнопку отправки формы несколько раз, поэтому сервер обрабатывает форму более одного раза. Это также может произойти, когда пользователь нажимает кнопку «Назад», отправив форму, и поэтому она снова обрабатывается.Какие методы доступны для остановки нескольких обратных передач формы в ASP.NET MVC?

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

Возможности, как я вижу его являются:

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

Есть ли еще?

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

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

С нетерпением ожидаем услышать от вас MVC'ers.

ответ

16

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

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

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

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

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

+0

Интересная идея, я бы добавил, что вы должны поместить последовательность в транзакцию: 1) проверить nonce 2) процесс 3) удалить nonce. Если вы не делаете этого атомарно, у вас есть условие гонки, когда сообщение может обрабатываться многократно, особенно. если обработка занимает некоторое время, чтобы закончить (и пользователь нетерпелив). Одна вещь, о которой я до сих пор не совсем понимаю, если POST обнаруживает дублирующее представление, что должно быть возвращено пользователю? Страница, показывающая, что сообщение выполняется? – DSO

+0

Сначала я удалю ключ nonce, а затем сделаю обработку, чтобы все было просто. Как обращаться с обманом - это дизайнерское решение и зависит от вас. Однако описательный ответ на то, что только что произошло, поможет пользователю оценить ваше веб-приложение еще больше. – aleemb

+0

Вы видели реализацию ключей nonce в ASP.NET MVC, используя ActionFilters, возможно? Я могу представить, что это сделает реализацию очень простой и многоразовой. Он также может использовать БД или просто переменную сеанса. – WooWaaBob

1

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

0

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

5

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

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

+0

, что о наших милых гостей JS пользователей? – redsquare

+0

Сценарии могут быть неинтрузивными и вставляться способами, которые не будут беспокоить не-js-браузеры/пользователя. Если вы все еще беспокоитесь о представлениях с двумя формами, вам нужна какая-то логика на стороне сервера, чтобы справиться с этим. – mookid8000

+0

вот что я получаю. Логика лучше реализована на стороне сервера, чем полагаться на js – redsquare

2

Вы можете посмотреть на Post-Redirect-Get (PRG) модель:

+1

Шаблон PRG не решает проблему нажатия кнопки пользователя несколько раз. – DSO

+0

Нет, это не так: проблема с обратной кнопкой, хотя –

+0

, вы можете легко предотвратить двойной щелчок с помощью простой функции javascript. – josephdotca

 Смежные вопросы

  • Нет связанных вопросов^_^