Как вы препятствуете пользователю публиковать данные несколько раз на веб-сайте - PullRequest
16 голосов
/ 25 сентября 2008

Я работаю над веб-приложением (J2EE) и хотел бы знать, какие опции доступны для обработки двойной записи из браузера.

Решения, которые я видел и использовал в прошлом, все на стороне клиента:

  • Отключите кнопку отправки, как только пользователь нажмет ее.
  • Следуйте шаблону POST-Redirect-GET, чтобы предотвратить POST, когда пользователь нажимает кнопку возврата.
  • Обработка события onSubmit формы и отслеживание статуса отправки с помощью JavaScript.

Я бы предпочел реализовать решение на стороне сервера, если это возможно. Есть ли лучшие подходы, чем те, о которых я упоминал выше, или решения на стороне клиента лучше?

Ответы [ 7 ]

8 голосов
/ 25 сентября 2008

Трудно реализовать защищенное от идиотов решение (поскольку они всегда улучшают идиотов). Независимо от того, что вы делаете, клиентская сторона может манипулировать или работать неправильно.

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

8 голосов
/ 25 сентября 2008

Вы можете предоставить «тикет» как часть формы, какое-то случайное число - и убедиться, что оно не будет принято дважды на стороне сервера.

3 голосов
/ 25 сентября 2008

На ум приходят два серверных решения:

  1. Создание одноразовых "токенов" в скрытом поле формы. Когда токен используется, он удаляется из любой базы данных или объекта контекста сеанса, в котором вы его храните. Во второй раз он не принимается.
  2. Полученная информация из кэша, и если в течение определенного периода времени (10 минут? Час? Вы решаете!) Получена идентичная форма, она игнорируется.
2 голосов
/ 25 сентября 2008

В Struts есть что-то подобное, если вы используете его.

http://struts.apache.org/1.x/apidocs/org/apache/struts/util/TokenProcessor.html

2 голосов
/ 25 сентября 2008

мы используем чувствительный ко времени, одноразовый билет. Это похоже на идентификатор сеанса. Но это привязано к форме / странице.

Вы сбрасываете заявку, когда пользователь отправляет страницу, и обрабатываете только те страницы, которые имеют действительный билет. В то же время вы можете усилить безопасность, прикрепив билет к пользователю, поэтому, если поступит билет, отправленный пользователем, который не является пользователем, которому был отправлен билет, вы отклоните запрос. *

2 голосов
/ 25 сентября 2008

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

0 голосов
/ 25 сентября 2008

Я бы использовал временную метку и сравнивал бы значения с вашим кодом на стороне сервера. Если две временные метки достаточно близки и имеют одинаковый IP-адрес, игнорируйте отправку второй формы.

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