Xpoint
   [напомнить пароль]

Redirect vs 200 после POST

Метки: [без меток]
2012-04-28 17:42:09 [обр] Евгений Седов aka KPbIC(5/176)[досье]

Пользователь в форме вводит данные. Адрес скрипта тот же, что и адрес формы. Скрипт решает, что пользователь ввел ошибочные данные.

Как в этой ситуации поступить: отдать страницу или редиректнуть на нее же?

спустя 1 час 41 минуту [обр] Lynn «Кофеман»(3/571)[досье]

Можно и так и так.

Плюсы 200: просто нарисовать форму заново с сообщениями об ошибках в нужных местах. Все данные есть.
Минусы: страшное предупреждение браузера, если страница по какой-то причине будет перезагружатся (F5, или восстановление вкладки после падения браузера и т.п.) и если пользователь согласится, то повторный сабмит данных в скрипт.

У редиректа всё строго наоборот. Никаких страшных предупреждений и лишних сабмитов. Зато нужно как-то передавать где именно ошибка и какие данные пользователь вбивал. Впрочем это обычно несложно.

спустя 1 час 18 минут [обр] Thirteensmay(3/157)[досье]
Просто надо определиться насколько "страшно" это предупреждение, лично я считаю что зачастую не страшно, иначе редирект в простейшем случае на form.cgi?error_after_fill=blablabla
спустя 25 минут [обр] Jared(0/26)[досье]
Евгений Седов aka KPbIC[досье], я всегда использовал 200. Ради простоты и дабы не плодить лишних сущностей. Однако, если нет каких-то технологических необходимостей одного из подходов, это больше вопрос вкуса ИМХО.
спустя 55 минут [обр] Thirteensmay(3/157)[досье]
Jared[досье] Разрешите не согласиться, считаю что в общем случае лучше редирект, с подробными сообщениями об ошибках, особенно в случае сложных форм в серьезном приложении. 200 хоть и зачастую, но оправдывается лишь простотой, в т.ч. форм, утилитарностью, особенностями пользователей и "бизнес-моделью", т.е. вопрос не вкуса.
спустя 1 час 2 минуты [обр] Евгений Седов aka KPbIC(5/176)[досье]
Thirteensmay[досье] Я имел в виду без ...?error..., а в точности тот же адрес: запоминать ошибки в сессии при редиректе, а на 200 выводить ошибки и удалять их из сессии.
спустя 1 час 22 минуты [обр] Marat Tanalin(4/78)[досье]
Если форма заполнена неправильно и требует правки, то её повторная отправка никаких негативных последствий иметь не будет. Если данные корректны — тогда делаем редирект.
спустя 1 день 22 часа [обр] Thirteensmay(3/157)[досье]

Евгений Седов aka KPbIC[досье] ?error это простейший случай, можно и с сессией, но могут быть проблемы с историей - если после удаления из сессии юзер начнет ходить взад вперед. И я не понял, 200 вы имеете в виду сразу от обработчика формы после сабмита, или после редиректа, если после редиректа то естественно, если же после сабмита то ничего удалять не надо, ибо не надо ничего запоминать - ошибки в этом случае определяются и выводятся в один заход.

Marat Tanalin[досье] Это не решает проблемы "страшного предупреждения"

спустя 1 час 58 минут [обр] Marat Tanalin(4/78)[досье]
Thirteensmay[досье]
Никакой проблемы и нет.
спустя 2 часа [обр] Евгений Седов aka KPbIC(5/176)[досье]

Thirteensmay[досье] Вам я говорил только о варианте редиректа после ошибки. То есть, чтобы передать ошибку через редирект в скрипте смотрим — если редирект, запоминаем ошибки, а если отдаем 200 (после редиректа) помещаем ошибки в форму и очищаем от них сессиию, так как ошибки использованы и хранить их дальше смысла не имеет. Правда, кроме ошибок придется также запоминать и данные формы, чтобы не заставлять пользователя повторно вводить данные.

В принципе, мне нравится логика Марата[досье]. Смятением неопытных пользователей от предупреждения можно пренебречь. Проблема повторного сабмита некорректных данных будет проявляться только если отслеживать попытки и на этом основании дискриминировать пользователя (сессию). В общем, решаемо.

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

Thirteensmay[досье] А какие проблемы с историей могут возникнуть, если юзер начнет ходить взад-вперед?

спустя 6 часов [обр] Jared(0/26)[досье]

Евгений Седов aka KPbIC[досье], если с данного ip вообще недоступна регистрация, пожалейте юзера, не заставляйте его вводить данные о регистрации. Сразу отпишите, что он не может зарегиться.

ИМХО, серверный компонент, который отдает форму (так или иначе), проверяет ее на ошибки, и далее, в отсутствие оных, данные обрабатывает; или при присутствии ошибок отдает форму обратно с указанием на эти ошибки - должен быть один. При условии работы в одном домене конечно. Редирект здесь ни к селу ни к городу.

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

спустя 8 часов [обр] Thirteensmay(3/157)[досье]

Евгений Седов aka KPbIC[досье] С историей, после удаления ошибок из сессии, если пользователь вернется назад то не увидит страницу с ошибками, она у него какбы в историю не запишется, впрочем если вы впоследствии ничего хитрого что потребует точного соблюдения истории, навешивать не собираетесь, то это можно рассматривать как плюс :)

"Серверный компонент" который отдает форму, обрабатывает и показывает ошибки, в любом случае один, мы же редиректимся на него же. Вопрос в том что редирект позволяет избавится от "страшного предупреждения", повторного сабмита, затруднений пользователя. Наверное надо разобрать подробнее, чем же это так страшно. Во первых предупреждение это как кирпич на ровном месте, заставляет отвлечься и потратить время, во вторых оно сбивает с толку, и не только неопытного пользователя, ибо политика сайта в области обработки таких ситуаций может быть разной, в зависимости от ситуации, и в общем случае не известна, то ли это правда приведет к задваиванию, толи нет, тем более пользователь зачастую не помнит были ли там ошибки, в результате пользователь не только сбивается с толку но и реально в тупике - не может идти дальше потому как не знает к чему это приведет. В третьих это таки приводит к задвоению, ибо повтор в предупреждении зачастую нажимается машинально, особенно если сайт исповедует политику "повторная отправка никаких негативных последствий иметь не будет" (пользователь как я уже сказал зачастую не помнит что там было перед). Конечно при ряде обстоятельств напрягаться с редиректом смысла не имеет, но если у нас серьезный сайт, мы претендуем на то что все сделано "правильно", заботимся о пользователе и т.п, то пренебрегать такими вещами по моему не стоит.

Немного отвлекаясь от темы, хочу заметить что существует еще один вариант отправки форм, в принципе лишенный рассматриваемых проблем - AJAX :) лично я последние годы в основном только им и пользуюсь, страница не перегружается, минимальный трафик и нагрузка на сервер :)

спустя 13 часов [обр] Филипп Ткачев(5/112)[досье]
Может сделать через Ajax? Здорово отсекает ботов и народ с выключенным JS.
спустя 4 часа 49 минут [обр] Евгений Седов aka KPbIC(5/176)[досье]

Jared[досье]

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

Почему, собственно, редирект ни к селу, ни к городу? Он предотвращает повторный ошибоный сабмит. Что в этом плохого? Что плохого в самом редиректе? Есть формы, обработка множественного сабмита которых приводит к появлению новых экземпляров. Форма заказов, например. При обработке которой, в отличие от формы регистрации, вы не можете определить, хочет ли юзер докупить еще, или просто ошибочно подтвердил повторный сабмит.

спустя 1 день 1 час [обр] Евгений Седов aka KPbIC(5/176)[досье]

Филипп Ткачев[досье], Thirteensmay[досье] Я не вижу плюсов Ajax'a в этой задаче:

  • отсекать ботов я умею по-другому;
  • отсекать народ с выключенным JS считаю неправильным;
  • лишние 99 байт трафика не являются проблемой;
  • нагрузка на сервер не увеличивается нисколько, так как запросы к базе те же самые;
  • сраница, не перегружаемая по нажатию кнопки, может быть непривычна многим пользователям — сомнительное достоинство.

И вообще, это другая тема.

спустя 3 часа 53 минуты [обр] Jared(0/26)[досье]

Евгений Седов aka KPbIC[досье] если ip пользователя попал в бан-лист, то ему об этом должно быть сообщено при любом способе запросить урл формы. Заботиться о том, чтобы бедные спамеры не пугались непонятных окон - это уже вообще бред какой-то. К тому же нет вообще никаких гарантий что агент - не бот. Вы же не на каждый запрос требуете капчу. А перекидывать куки боту из браузера можно в полуавтоматическом режиме. Боту, как известно вообще может быть плевать на редиректы.

Вашу форму заказов конкурент если что заспамит так, что в десятках тысячах фейков вы никогда не найдете 2 реальных заказа.

Предотвращать действия при ошибочном сабмите нужно на сервере. Клиенту доверять нельзя ни в чем вообще. Редирект нужен только чтобы "не пугать пользователя"; этим, как мне кажется, можно пренебречь.

По поводу ajax

  • выключенный js - пятнадцать тысячных процента пользователей с выключенным js, или сидящих из-под консольных браузеров или вовсе из под telnet - вряд ли наши клиенты, ими можно пренебречь ИМХО;
  • 99 байт - только в случае если у вас разметка на 99 байт; бывает на несколько порядков больше;
  • при ответе на ajax запрос нагрузка все же как правило уменьшается - отдавать данных меньше, шаблонизация может быть другой... правда это экономия на спичках;
  • пользователь уже привык к ajax; покажите ему красивую картику "loading....", или вовсе прогресс-бар, и он будет доволен;

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

спустя 1 день 21 час [обр] Евгений Седов aka KPbIC(5/176)[досье]
М Имейте совесть, это тема не про Ajax. Я, пожалуй, после праздников вычищу отсюда весь оффтоп. Так что, если у кого-то есть желание обсудить Ajax vs POST в принципе, или применительно к Точке, очень прошу создать собственные темы, скопипастив отсюда то, что считаете нужным, или пожалуйте в IRC.
Powered by POEM™ Engine Copyright © 2002-2005