2008-09-10 2 views
4

Скажите, что пользователь просматривает веб-сайт, а затем выполняет некоторые действия, которые меняют базу данных (скажем, добавляют комментарий). Когда приходит запрос на добавление комментария, мы обнаруживаем, что нам нужно заставить их войти в систему, прежде чем они смогут продолжить.Сохранение HTTP-данных POST, когда запрос прерывается страницей входа в систему

Предположим, что страница входа в систему запрашивает имя пользователя и пароль и перенаправляет пользователя обратно к URL-адресу, который они собирались при необходимости входа в систему. Это перенаправление работает для поиска URL с только параметрами GET, но если запрос первоначально содержал некоторые HTTP POST-данные, которые теперь потеряны.

Может ли кто-нибудь рекомендовать способ справиться с этим сценарием, когда задействованы данные HTTP POST?

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


Edit: Одно дополнительное ограничение, я должен ясно - Представьте себе, что мы не знаем, если будет необходим Войти, пока пользователь не представит свой комментарий. Например, их cookie, возможно, истек, когда они загрузили форму и фактически отправили комментарий.

ответ

2

2 варианта:

  1. выписывать беспорядочную форму на странице входа, и JavaScript form.submit() его на страницу.
  2. Отправьте страницу входа в систему по умолчанию на запрашивающую страницу (с предыдущими значениями) и попросите контроллер этой страницы выполнить проверку входа. Переверните это в любую логику, которая у вас уже есть, для обнаружения не зарегистрированного пользователя (рамки зависят от того, как они это делают).В псевдо-MVC:

     CommentController { 
      void AddComment() { 
      if (!Request.User.IsAuthenticated && !AuthenticateUser()) { 
       return; 
      } 
      // add comment to database 
      } 

      bool AuthenticateUser() { 
      if (Request.Form["username"] == "") { 
       // show login page 
       foreach (Key key in Request.Form) { 
        // copy form values 
        ViewData.Form.Add("hidden", key, Request.Form[key]); 
       } 
       ViewData.Form.Action = Request.Url; 

       ShowLoginView(); 
       return false; 
       } else { 
       // validate login 
       return TryLogin(Request.Form["username"], Request.Form["password"]); 
       } 
      } 
     } 
11

Это одно хорошее место, где могут быть полезны методы Ajax. Когда пользователь нажимает кнопку отправки, отображает диалоговое окно входа на клиентской стороне и проверяет его с сервером перед отправкой страницы.

Еще один способ, который я могу представить, - показать или скрыть элементы управления входами в теге DIV динамически на самой главной странице.

1

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

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

2

Просто сохраните все необходимые данные из POST в сеансе до завершения процесса входа в систему. Или у вас есть какая-то таблица temp в db для хранения, а затем извлечения. Очевидно, что это псевдокод, но:

if (!loggedIn) { 
    StorePostInSession(); 
    ShowLoginForm(); 
} 

if (postIsStored) { 
    RetrievePostFromSession(); 
} 

Или что-то в этом роде.

1

Я знаю, что он говорит от языка, но почему бы не воспользоваться конвенций, предоставляемых языком на стороне сервера, который вы используете? Если это была Java, данные могут сохраняться, установив атрибут Request. Вы должны использовать контроллер для обработки формы, обнаружения входа и последующего перехода. Если атрибуты установлены, то просто предварительно заполните форму этими данными?

Редактировать: Вы также можете использовать сеанс как указано, но я уверен, что если вы перейдете в Java на страницу входа, то атрибут Request будет сохраняться.

3

Возможно, вам захочется выяснить, почему Django removed this feature перед его внедрением. Это не похоже на специфическую проблему Django, а скорее на другую атаку подделки на кросс-сайт.

 Смежные вопросы

  • Нет связанных вопросов^_^