Как вы препятствуете пользователю публиковать данные несколько раз на веб-сайте

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

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

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

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

Ответы на вопрос(7)

 Mehraj Malik29 дек. 2017 г., 19:19
ссылка не работает.

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

 JeremyWeir20 авг. 2010 г., 01:13
Как вы справляетесь с пользователем, нажимающим кнопку «назад» (большинство браузеров неповторно запросить), изменив данные в форме и отправив "билет" снова?
 zigdon20 авг. 2010 г., 01:28
Вы можете't остановить пользователя от повторной отправки нового запроса с тем же тикетом, но вы можете отклонить его на стороне сервера с помощью "Дубликат запроса " ошибка.
 abel07 окт. 2010 г., 16:14
если отправка была завершена полностью, вы должны отключить токен или, если отправка была сделана частично, вы должны разрешить повторное использование токена, одновременно обрабатывая частично отправленные данные.
 JeremyWeir20 авг. 2010 г., 19:35
Правильно, но люди делают это специально - отправьте форму, нажмите назад, потому что они знают, что нужно что-то исправить, отправьте форму снова. Их законное использование браузера »Кнопка назад для редактирования записи может привести к ошибке.
 Mehraj Malik29 дек. 2017 г., 19:18
Итак, билет будет созданза получение запроса к форме ИЛИ за загрузку формы, я прав? но что, если пользователь обновил страницу (еще один запрос req, еще один новый тикет) ... как с этим справиться?
 zigdon20 авг. 2010 г., 20:03
Конечно, и если этоЭто закономерный шаблон, который вы можете добавить для поддержки - на стороне сервера найдите их предыдущий запрос (с тем же билетом) и обновите информацию по мере необходимости. Это'твой звонок, как долго тыВы готовы принять изменения в форме, конечно.

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

 paan25 сент. 2008 г., 00:41
ОП запросил решение на стороне сервера
 VirtuosiMedia25 сент. 2008 г., 00:43
Я не'Я не очень внимательно прочитал пост, но я отредактировал свой ответ, чтобы он больше соответствовал вопросу.
 roryf25 сент. 2008 г., 00:50
А что, если у пользователя действительно есть два бита данных, которые он хочет опубликовать в этот период времени? Кажется, тебе не повезло.

Создать одноразовое использование »жетоны» в скрытом поле формы. Как только токен используется, он удаляется из любой базы данных или объекта контекста сеанса, который высохранить его во второй раз, этоне принимаются.Полученная информация кэшируется, и если идентичная форма получена в течение определенного периода времени (10 минут? Час? Вы решаете!), Она игнорируется.
 JeremyWeir20 авг. 2010 г., 01:15
1. Как вы справляетесь с пользователем, нажимающим кнопку «назад» (большинство браузеров неповторно запросить), изменив данные в форме и снова отправив тот же токен? 2. Что если в течение периода времени форма будет отправлена со значением A, то пользователь изменит ее на значение B, а затем снова вернет ее к значению A? Wouldn»Неужели это игнорирует последнее изменение?
Решение Вопроса

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

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

Это как идентификатор сессии. Но это привязано к форме / странице.

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

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

Ваш ответ на вопрос