Существуют ли методы для предотвращения двойного представления в веб-приложениях без сохранения состояния? - PullRequest
8 голосов
/ 19 сентября 2011

Я хочу реализовать двойное предотвращение отправки в существующем веб-приложении на Java (фактически, Struts).В архитектуре мы говорим о 2 или N возможных серверах приложений (tomcat) и одном сервере баз данных (mysql).Отдельные серверы не знают друг друга и не могут обмениваться сообщениями.Перед серверами приложений находится один балансировщик нагрузки, который может выполнять липкие сеансы .

. Таким образом, в основном существует два вида защиты клиента от двойного представления и стороны сервера.Если возможно, я хочу перейти на серверную сторону, потому что все методы на стороне клиента, по-видимому, терпят неудачу, если люди отключают файлы cookie и / или javascript в своих браузерах.

Это оставляет меня с идеей сделать какую-то мьютекс-подобную синхронизациючерез блокировки базы данных.Я думаю, что можно рассчитать контрольную сумму введенных пользователем данных и сохранить их в отдельной таблице базы данных.При каждом представлении заявка должна проверять наличие одинаковой контрольной суммы, которая указывает на то, что данное представление является дубликатом.Конечно, контрольные суммы в этой таблице должны периодически очищаться.Проблема заключается в том, что весь процесс проверки наличия дублирующей контрольной суммы в базе данных и вставки контрольной суммы, если ее нет, в значительной степени критический раздел .Поэтому таблицу контрольных сумм необходимо предварительно заблокировать и снова разблокировать после раздела.

Мои тупик и горлышко бутылки Сигналы тревоги начинают звонить, когда я думаю о блокировках таблицы,Поэтому мой вопрос таков: существуют ли более разумные способы предотвращения двойной отправки в веб-приложениях без сохранения состояния?

Обратите внимание, что распорки TokenInterceptor не могут быть применены здесь, потому что они терпят неудачу, когда файлы cookieотключен (он использует сеанс HTTP, который просто отсутствует без файлов cookie сеанса).

Ответы [ 3 ]

6 голосов
/ 19 сентября 2011

Более простое решение на основе БД будет примерно таким. Это также можно сделать общим для нескольких форм.

  • Иметь таблицу базы данных, которую можно использовать для хранения токенов.
  • Когда отображается новая форма - вставьте новую строку в таблицу токенов. и добавьте токен как скрытое поле в форме.
  • Когда вы получите форму отправки, выберите для обновления в строке соответствует токену, который вы получили как часть формы.
  • Если строка все еще существует, то это первая отправка. Обработать отправить и удалить строку.
  • Если строка не существует, то форма уже обработана - Вы можете вернуть ошибку.
1 голос
/ 19 сентября 2011

Классический метод предотвращения двойных представлений состоит в назначении двух идентификаторов (оба в виде «скрытого» поля в теге HTML-формы) - одного «идентификатора сеанса», который остается неизменным от входа в систему до выхода из системы ...

Второй идентификатор меняется при каждой отправке ... на стороне сервера вам нужно отслеживать только «текущий действующий идентификатор» (для сеанса) ... если вы получаете «повторную отправку» (по клику- happy-user, или «кнопка обновления», или «кнопка возврата», или ...) тогда это не будет соответствовать текущему идентификатору ... таким образом, вы знаете: это представление должно быть отброшено, и генерируется новый идентификатор и отправили обратно с ответом. В некоторых реализациях используется идентификатор, который добавляется в каждую отправку, что немного облегчает часть проверки / отслеживания, но может быть уязвимым для «угадывания» (из соображений безопасности) ... Мне нравится генерировать криптографически стойкие идентификаторы для такой защиты ...

Если у вас есть среда с балансировкой нагрузки с липким сеансом, тогда вам нужно только отслеживать идентификатор на самом сервере (в памяти) ... но вы, безусловно, можете сохранить идентификатор в БД ... так как Вы сохраняете его вместе с идентификатором сессии, блокировка будет на «уровне строки» (не на уровне таблицы), что должно быть в порядке.

То, как вы описали, идет на шаг дальше, изучая контент ... НО я вижу часть контента больше на уровне "логики приложения", чем на "уровне предотвращения повторной отправки", поскольку это зависит от того, логика приложения или нет. он хочет снова принять те же данные ...

0 голосов
/ 19 сентября 2011

Что если вы работаете с липкими сессиями , тогда вам будет хорошо с некоторым TokenManagement.Существует DoubleClickFilter, который вы можете добавить к своему web.xml.

Поскольку у вас есть липкие сессии, вам не нужно Cross-Tomcat-Solution.

...