【发布时间】:2014-05-04 07:28:31
【问题描述】:
我希望有一个基本的 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 sample code for using Ring middleware,有两个关键内容要添加到您的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)。但是我如何以及在哪里添加到会话中?一个例子将不胜感激。
【问题讨论】:
标签: session clojure middleware ring pedestal