Как отображать сообщения пользователю после перенаправления POST + HTTP
Im использует шаблон PRG, чтобы избежать множественного представления формы. Тем не менее, это серьезный недостаток - вы не можете просто echo
подтвердить сообщение пользователю (очевидно, пользователь не увидит страницу, он будет перенаправлен на другой).
Каковы решения этой проблемы? Я знаю двух из них, но ни один из них не кажется идеальным.
- Используйте настраиваемый URL-адрес перенаправления, например:
http://example.com/?msg=data-saved
. Его безграждан, поэтому я считаю его вполне надежным. Но это создает проблемы, когда пользователь копирует ссылку, заносит закладки и т.д.
- Сохраните переменную сеанса/файл cookie и проверьте его при каждой загрузке страницы. Если его набор, очистите его и покажите сообщение. Кажется, все в порядке, но я не уверен в этом - он сильно полагается на файлы cookie, это немного сложнее.
Или, может быть, есть другие способы, о которых я не знаю? Некоторая комбинация сеансов и параметров URL? Незнайка.
Какой лучший способ, на ваш взгляд? У кого есть наименьшие недостатки? Каковы плюсы и минусы?
Ответы
Ответ 1
Практически каждый веб-сайт, который позволяет пользователям регистрироваться, делает это, полагаясь на файл cookie. Это не идеальное решение, но это лучшее, что мы получили.
Также обработка сеанса - это одна из тех вещей, которые обычно заботятся о веб-разработке.
Ответ 2
Есть несколько других проблем с переполнением стека, которые касаются этого, хотя я не думаю, что это достаточно четко изложить проблему. Вот несколько:
Большинство удобных решений основаны на сеансах или имеют более серьезные недостатки (например, встраивание сообщения в строку запроса).
Если вы не можете гарантировать, что у вас будут сеансы, другой (довольно дорогостоящий) метод - перенаправить на разные представления в зависимости от результата подачи формы. Например, вы можете перенаправить на EditWidgetView
, EditWidgetSaveSuccessfulView
или EditWidgetSaveErrorView
(или, возможно, вы просто не перенаправляете на ошибки). На некоторых языках и в каркасах это нецелесообразно, так как вы отказываетесь от отображения сообщений о подтверждении/ошибке вообще, но в других это может быть полезно.
Ответ 3
Если вы не хотите полагаться на сеансы по какой-либо причине, вы можете использовать переменную Get/custom url, а затем, если эта переменная присутствует, проверьте ссылку. Если ссылка правильная, тогда отобразите сообщение. Да, это добавляет зависимости от отправленных ссылок, чтобы отобразить подтверждающее сообщение, но в противном случае вы полагаетесь на сеансы (которые, будучи надежными, не на 100% идеальны для всех решений.)
И, честно говоря, некоторые крупные сайты, которые обычно хорошо разбираются в подобных вещах, просто вставляют "actiondone = true" в url. (Я заметил, что Facebook делает это в некоторых местах.)
Ответ 4
Это зависит от того, на какой платформе вы работаете.
Ruby on Rails вызывает эту вспышку [: notice] = "Ваше действие выполнено", ASP.NET MVC вызывает этот TempData [ "notice" ] = "Ваше действие выполнено"...
В основном они просто хранят данные в HttpSession только для одной поездки в оба конца. Таким образом вы можете получать данные по другому веб-запросу.
Ответ 5
Очень поздно приступить к обсуждению.
Вы можете использовать комбинацию двух предложенных опций.
После запроса POST клиент перенаправляется (303) на URL-адрес, указывающий, что для этого запроса может быть ответное сообщение:
Client: GET http://example.com/foo.cgi
Server: 200 Ok
Client: POST http://example.com/bar.cgi
Server: 303 http://example.com/foo.cgi?msg=true
Если аргумент msg
true
, сообщение будет просмотрено в сеансе и (если найдено), включенное в ответ клиенту.
Если аргумент msg
! true
(или отсутствует), шаг поиска пропускается.
С помощью этого решения вы предотвращаете отображение фактического сообщения в URL-адресе, только URL указывает, что может быть сообщение. Кроме того, сообщение отображается только при необходимости (= когда он найден в сеансе).
Другим преимуществом является то, что это решение также позволяет включать правильные средства управления наличностью в ответы HTTP.
Ответ 6
Я использую метод переменной сеанса. Мне не очень нравится встраивать сообщения об ошибках для отображения в URL-адресе, особенно с учетом проблем с сохранением URL-адреса и совместного использования, и мне нравится, что если пользователь перезагрузит целевую страницу, это будет чистый экземпляр.