2012-09-19 51 views
10

我有一個compojure應用程序,它使用鈴聲會話包裝來存儲與當前用戶關聯的OAuth令牌。我希望這個令牌在服務器重新啓動時保持可用,這樣我就不必每次都經歷auth過程。Compojure/Ring:爲什麼cookie服務器的會話不能在服務器重啓後繼續?

我認爲使用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"})}))) 

功能root-handler使用該令牌來決定是否有人登錄或沒有,但在會話信息的方式不返回任何東西。

回答

11

問題在於您的應用程序中包含會話中間件,因爲處理程序/站點附帶了一箇中間件。這導致加密/解密運行兩次。要配置的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

要讓最後一個持久化,你需要c檢查你選擇的servlet容器的文檔。

相關問題