我很欣赏一个基本的基座示例,说明如何(1)设置在服务器重新启动后仍然存在的 cookie 和(2)使用基于 cookie 的会话;特别是如何获取和设置值。
我有点惊讶没有找到使用的示例ring.middleware.session/wrap-session
(此处的源代码:https ://github.com/ring-clojure/ring/blob/master/ring-core/src/ring/middleware/session.clj ) .
设置
根据这个使用 Ring 中间件的 Pedestal 示例代码,有两个关键的东西要添加到您的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)
. 但是我如何以及在哪里添加到会话中?一个例子将不胜感激。