Запрет повторной отправки формы комментариев - PullRequest
3 голосов
/ 28 апреля 2010

У меня есть форма комментария для статьи, и я хотел бы предотвратить повторное представление. Я заметил, что Worpdress справляется с этим очень хорошо (возвращение не заставляет браузер запрашивать повторную отправку формы), но я не могу понять, как они это делают, даже если наши методы очень похожи.

Мой сценарий

Пользователь посещает mydomain.com/article/1/article_title.html

Заполняет форму, которая отправляет сообщения на mydomain.com/addnewcomment/1.html

.

Затем я делаю перенаправление 302 обратно на mydomain.com/article/1/article_title.html

.

Теперь, если я нажимаю назад с этой позиции, он не запрашивает перенаправление. Однако, если я перейду на другую страницу, например mydomain.com/tag/1/my_tag.html и нажмите обратно, чтобы повторно отправить форму.

Очевидно, я хочу предотвратить это.

Что делает Wordpress

Пользователь посещает mydomain.com/?p=1 Заполняет форму, которая отправляет на mydomain.com/wp-comments-post.php Это тогда делает 302 перенаправления назад к mydomain.com/?p=1

Повторное нажатие или посещение другой страницы и повторное нажатие не вызывает повторной отправки.

Я просмотрел код WP, но не понимаю, как им это удается. Очевидно, это то, чего я хотел бы достичь.

У кого-нибудь есть мысли о том, где я могу пойти не так?

(я использую Wordpress только в качестве примера, чтобы доказать, что это возможно, очевидно, я не пытаюсь точно дублировать WP, это было бы бессмысленно)

РЕДАКТИРОВАТЬ - понял, что это было

Я точно не указал, какой это был заголовок, но я отправлял дополнительные заголовки перед выполнением перенаправления (проблема с моим кодом, вызов одной функции перед перенаправлением, когда действительно мне следовало сначала вызвать перенаправление).

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

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

Заголовки, которые я отправлял куда:

Content-Type Последнее изменение Etag Content-язык Cache-Control Pragma Истекает

Полагаю, это было связано с прагмой no-cache или must-revalidate в заголовке элемента управления cache.

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

Ответы [ 3 ]

1 голос
/ 28 апреля 2010
0 голосов
/ 28 апреля 2010

Именно поэтому я предпочитаю использовать UUIDs в качестве ключей строки таблицы. Для такой проблемы я бы сгенерировал ключ строки в пустом поле комментария как скрытое поле. Затем, если кто-то попытается обновить или отсканировать и отправить, INSERT не удастся, потому что ключ уже существует.

0 голосов
/ 28 апреля 2010

Добавьте в форму скрытое поле с большим случайным числом или, если вы хотите сойти с ума, отметку времени с добавленным случайным числом.

Затем сохраните этот номер вместе с сообщением и дважды проверьте, использовался ли этот номер ранее. Если это так, не репост.

Это также обрабатывает все ситуации, которые PRG не может решить, то есть (из вики):

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