Установите и используйте сеанс на основе файлов cookie в Pedestal
Я был бы признателен за базовый пример Pedestal: 1) настроить файлы cookie, которые сохраняются после перезапуска сервера, и (2) использовать сеансы на основе файлов cookie; в частности, как получить и установить значения.
Я немного удивлен, не найти пример, который использует ring.middleware.session/wrap-session
(исходный код здесь: https://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/session.clj).
Настроить
В соответствии с этим примером кода Pedestal для использования промежуточного программного обеспечения Ring, есть две ключевые вещи, которые нужно добавить к вашему service.clj
, Сначала определите перехватчик сеанса:
; aliases for namespace :require
[io.pedestal.http.ring-middlewares :as middlewares]
[ring.middleware.session.cookie :as cookie]
(definterceptor session-interceptor
(middlewares/session {:store (cookie/cookie-store)}))
Однако в примере кода есть такая оговорка:
В этом примере кода мы не указываем секрет, с помощью которого данные сеанса шифруются перед отправкой обратно в браузер. Это имеет два следствия, во-первых, нам нужно использовать один и тот же экземпляр-перехватчик во всей службе, чтобы данные сеанса были доступны для чтения и записи для всех путей. Второе следствие заключается в том, что данные сеанса станут невосстановимыми после завершения процесса сервера. Несмотря на то, что браузер сохраняет cookie, он не является невосстановимым зашифрованным текстом, и перехватчик сеанса будет считать его несуществующим.
Как мне преодолеть вышеуказанные ограничения?
И, во-вторых, добавить session-interceptor
на ваши маршруты (ниже приведен пример кода):
(defroutes routes
[[["/"
{:get [:root root/index]}
^:interceptors [session-interceptor
(body-params/body-params)
bootstrap/html-body]]]]
Использовать (получить и установить)
Я знаю, что приведенные выше шаги по установке заставляют промежуточное ПО Ring добавлять :session
ключ к карте запроса. Таким образом, получить легко: (:session request)
, Но как и где я могу добавить к сессии? Пример будет оценен.
1 ответ
На данный момент, чтобы ответить на некоторые из моих вопросов:
Указание ключа означает, что сеансы, поддерживаемые файлами cookie, будут повторно читаться после перезапуска сервера, как упоминалось в Compojure/Ring: почему сеанс с cookie-store не выдерживает перезапуск сервера?, Вот некоторый код, который показывает, как:
; (:require [crypto.random :as random])
(def the-key (random/bytes 16)) ; run once
{:store (cookie-store {:key the-key})}
Когда дело доходит до изменения значения сеанса:
"Чтобы установить значение: session, просто передайте его вместе с вашим ответом. Если вам не нужно менять сессию, оставьте: сессия вне вашего ответа. Если вы действительно хотите очистить сеанс, передайте nil в качестве значения: ключа сеанса ". (От: Luke VanderHart и Ryan Neufeld." Clojure Cookbook ".)