Я пытаюсь закодировать страницу входа, где:
пользователь заполнит форму методом 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. Кстати, я не знаю, является ли попытка использовать дракму для этой проблемы излишним или нет.
Спасибо, что дочитали до конца.