我有一个compojure应用程序,它使用环会话包装器来存储与当前用户关联的OAuth令牌。我希望这个令牌在服务器重新启动时保持可用,这样我就不必每次都经过身份验证过程。
我认为使用cookie-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
使用令牌来决定是否有人登录,但不会以会话信息的方式返回任何内容。
答案 0 :(得分:11)
问题是您的应用中有 2 包装会话中间件,因为处理程序/网站附带了一个。这导致加密/解密运行两次。要配置compojure会话句柄,请使用:
(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容器的文档。