Compojure/Ring:为啥与 cookie-store 的会话在服务器重新启动后无法幸存?
Posted
技术标签:
【中文标题】Compojure/Ring:为啥与 cookie-store 的会话在服务器重新启动后无法幸存?【英文标题】: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
函数使用令牌来判断是否有人登录,但不会以会话信息的方式返回任何内容。
【问题讨论】:
【参考方案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 容器的文档。
【讨论】:
以上是关于Compojure/Ring:为啥与 cookie-store 的会话在服务器重新启动后无法幸存?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Clojure/Compojure/Ring 中将映射转换为 URL 查询字符串?
在开发基于 compojure/ring 的应用程序时使用 emacs/cider 的正确方法是啥?
为啥 SFSafariWebViewController 不能与 Safari 正确共享 cookie?