【问题标题】:Compojure/Ring: Why doesn't a session with cookie-store survive a server restart?Compojure/Ring:为什么与 cookie-store 的会话在服务器重新启动后无法幸存?
【发布时间】:2012-09-12 03:21:14
【问题描述】:

我有一个组合应用程序,它使用环会话包装器来存储与当前用户关联的 OAuth 令牌。我希望这个令牌在服务器重新启动时保持可用,这样我就不必每次都通过身份验证过程。

我认为使用 cookie-store 而不是默认的 memory-store 会有所帮助,但事实并非如此。我错过了什么?

这是代码的相关部分:

(defn auth-callback-handler
  [session {code :code}]
  (let [token (retrieve-token code)]
    (-> (redirect "/") (assoc :session (assoc session :token token)))))

(defroutes app-routes
  (GET "/" {session :session} (root-handler session))
  (GET "/auth-callback" {session :session params :params} (auth-callback-handler session params))
  (route/not-found "Not Found"))

(def app
  (-> (handler/site app-routes)
      (wrap-session {:store (cookie-store {:key "a 16-byte secret"})})))

root-handler 函数使用令牌来判断是否有人登录,但不会以会话信息的方式返回任何内容。

【问题讨论】:

    标签: session cookies clojure compojure ring


    【解决方案1】:

    问题是您的应用中有 2 个 wrap-session 中间件,因为处理程序/站点自带一个。这导致加密/解密运行两次。要配置组合会话句柄,请使用:

    (def app
      (site app-routes {:session {:store (cookie-store {:key "a 16-byte secret"})}}))
    

    另外,也许您会对其中一些实现环 SessionStore 协议的项目感兴趣:

    https://github.com/sritchie/couch-session

    https://github.com/wuzhe/clj-redis-session

    https://github.com/rmarianski/servlet-session-store

    要使最后一个持久化,您需要检查您选择的 servlet 容器的文档。

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 2014-05-25
      • 2017-09-03
      • 2013-07-16
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 2020-10-04
      相关资源
      最近更新 更多