Session Compojure/Ring:为什么';具有cookie存储的会话在服务器重新启动后是否仍然有效?

Session Compojure/Ring:为什么';具有cookie存储的会话在服务器重新启动后是否仍然有效?,session,cookies,clojure,compojure,ring,Session,Cookies,Clojure,Compojure,Ring,我有一个compojure应用程序,它使用环会话包装器来存储与当前用户关联的OAuth令牌。我希望这个令牌在服务器重新启动时保持可用,这样我就不必每次都通过身份验证过程 我认为使用cookie存储而不是默认内存存储会有所帮助,但事实并非如此。我错过了什么 这是守则的相关部分: (defn auth-callback-handler [session {code :code}] (let [token (retrieve-token code)] (-> (redirect

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

我认为使用cookie存储而不是默认内存存储会有所帮助,但事实并非如此。我错过了什么

这是守则的相关部分:

(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"})})))

函数
根处理程序
使用令牌决定是否有人登录,但不会以会话信息的方式返回任何内容。

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

(def app
  (site app-routes {:session {:store (cookie-store {:key "a 16-byte secret"})}}))
此外,您可能会对其中一些项目感兴趣,这些项目实现了ring SessionStore协议:

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