Post/Redirect/Get
Post/Redirect/Get | |
---|---|
Post/Redirect/Get | |
Описан в Design Patterns | Нет |
Post/Redirect/Get (PRG) — модель поведения веб-приложений, используемая разработчиками для защиты от повторной отправки данных веб-форм (от т. н. double submit problem). Модель PRG обеспечивает интуитивно понятное поведение веб-приложений при обновлении страниц в браузере и при использовании закладок в браузере.
Суть проблемы повторной отправки веб-формы заключается в том, что после первой отправки и получения результата пользователь может нажать в браузере кнопку "Обновить", в результате чего данные могут быть отправлены повторно, а это может привести к нежелательным последствиям, как, например, повторная покупка в интернет-магазине, повторный перевод денег с банковского счета и т. д. Повторная отправка может произойти и без кнопки "Обновить", если браузер настроен автоматически "восстанавливать вкладки" после его закрытия и открытия. В этом случае, если пользователь закроет браузер после первой отправки формы, не закрыв вкладку с результатом, а затем вновь откроет браузер, то браузер запросит повторно все страницы прошлой сессии, включая отправку формы. (Нужно отметить, что в последнее время многие производители браузеров уделили внимание этой проблеме, и браузеры стали спрашивать у пользователя разрешение на повторную отправку форм).
Суть решения проблемы при использовании модели PRG заключается в том, что в ответ на отправку данных веб-формы, сервер не просто генерирует HTML-страницу с результатом, а возвращает браузеру заголовок перенаправления «Location» (при этом используются коды состояния HTTP 302, HTTP 303, иногда HTTP 301) ведущий на страницу с результатом, но уже вызываемым обычным методом GET, а не POST, и без данных веб-формы, конечно. При обновлении такой страницы с результатом нежелательных действий не произойдет, её даже можно использовать в качестве закладки в браузере.
Ссылки
- Redirect After Post, Michael Jouravlev, August 2004
- Description of the pattern for J2EE, Michael Jouravlev, August 14, 2003
- Is the Portlet Programming Model Broken? Subbu Allamaraju
- How to avoid POSTDATA resend warning Anis uddin Ahmad
- ASP.NET MVC — RC1 — Паттерн Post-Redirect-Get Alex Nesterov
- Пример обработки формы и реализация шаблона Post/Redirect/Get на языке PHP
В статье есть список источников, но не хватает сносок. |