【问题标题】:Setup and use a cookie-based session in Pedestal在 Pedestal 中设置和使用基于 cookie 的会话
【发布时间】: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


    【解决方案1】:

    现在,回答我的一些问题:

    Compojure/Ring: Why doesn't a session with cookie-store survive a server restart? 所述,指定密钥意味着在服务器重启后可重新读取由 cookie 支持的会话。下面是一些代码,展示了如何:

    ; (:require [crypto.random :as random])
    (def the-key (random/bytes 16)) ; run once
    {:store (cookie-store {:key the-key})}
    

    当谈到改变会话的价值时:

    “要设置 :session 的值,只需将它与您的响应一起传递即可。如果您不需要更改会话,请将 :session 排除在您的响应之外。如果您想真正清除会话,请将 nil 作为 :session 键的值传递。” (来自:Luke VanderHart and Ryan Neufeld. “Clojure Cookbook.”

    【讨论】:

    • 您有进一步了解吗?如果你能发布一个工作代码sn-p,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2018-09-07
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多