hunchentoot вокруг метода для перенаправления с параметрами публикации

Я пытаюсь закодировать страницу входа, где:

  • пользователь заполнит форму методом post

  • если форма имеет целевой URL-адрес, начинающийся с /auth-, пользователь будет перенаправлен на страницу /login

  • пользователь заполнит имя пользователя и пароль и т. д.

  • если авторизация дана, вся информация будет, скажем, вставлена ​​в базу данных

  • если имя пользователя или пароль неверны, вся информация будет сохранена для второго шанса

Намерение не сильно отличается от , как описано здесь., если моя цель еще не ясна.

Этот метод вокруг, вдохновленный этим вопросом, позволяет мне перенаправить любую ссылку, начинающуюся с auth-, чтобы перенаправить на страница входа вместе с параметрами get:

(defmethod hunchentoot:acceptor-dispatch-request :around
    ((acceptor hunchentoot:easy-acceptor) request)
  (let* ((address-bar (cl-ppcre:split "\\?" (hunchentoot:request-uri* request)))
         (just-url (first address-bar))
         (query-params (second address-bar)))
    (if (cl-ppcre:scan "^/auth-" just-url)
      (hunchentoot:redirect (if query-params
                (format nil "/login?~A" query-params)
                "/login"))
      (call-next-method))))

Но как я могу вместо этого перенаправить с параметрами сообщения?

Я думал что-то в этом роде:

(defmethod hunchentoot:acceptor-dispatch-request :around
    ((acceptor hunchentoot:easy-acceptor) request)
  (let* ((just-url (car (cl-ppcre:split "\\?" (hunchentoot:request-uri* request)))))
    (if (cl-ppcre:scan "^/auth-" just-url)
      (hunchentoot:redirect "/login")
      (call-next-method))))

(hunchentoot:define-easy-handler (login :uri "/login") ()
  (with-html-output (*standard-output* nil :prologue t)
    (:html
     (:body
      (dolist (post (hunchentoot:post-parameters*))
    (format t "<div>~A ~A</div>" (car post) (cadr post)))))))

будет работать, но страница /login ничего не показывает. Я предполагаю, что проблема в том, что нельзя перенаправить с почтовыми данными, как это предлагается ссылка выше.

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

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

Еще два момента:

  • Думаю, я могу сбросить всю форму в сеанс вместо того, чтобы публиковать их как этот ответ предполагает, но я не хочу отслеживать файлы cookie. Что, если пользователь решит сдаться, а все значения останутся в сеансе?

  • Я предпочитаю никогда не полагаться на код состояния http 307 как здесь.

  • Наконец, я не хочу пробовать такие фреймворки, как restas или caveman, потому что я хочу выучить lisp и вписаться в него. Я уверен, что эта проблема решалась много раз многими людьми. В прошлом я строил некоторые вещи с рельсами. Я был как сценарист, пока не выучил достаточно рубина, чтобы видеть вещи такими, какие они есть.

РЕДАКТИРОВАТЬ

Вместо (hunchentoot:redirect "/login") я также попробовал (drakma:http-request "http://127.0.0.1:4242/login" :method :post :parameters (hunchentoot:post-parameters* request)), что не удалось с СООБЩЕНИЕМ ОБ ОШИБКЕ 200. Кстати, я не знаю, является ли попытка использовать дракму для этой проблемы излишним или нет.

Спасибо, что дочитали до конца.


person barerd    schedule 01.04.2017    source источник