Ring:如何在中间件中修改会话

时间:2016-01-28 10:47:53

标签: clojure middleware ring

如何在Ring中间件中修改会话?我基本上希望有一个存储在那里的访问URL的历史记录,我只是无法让会话存储值。

会话在代码的其他地方正常工作,我可以返回响应。我认为这与问题有关,我不了解中间件如何工作。

这是我目前的代码

(defn wrap-history [handler]                                                                                                                                              
  (fn [req]                                                                                                                            
    (handler (assoc-in req [:session :history]                                                                                                                            
                       (vec (concat (-> req :session :history)  [(request/request-url req)]))))))                                                                

这是app(我使用的是包含会话中间件的ring-defaults)

(def app                                                                                                                                                          
  (-> all-routes                                                                                                                                                          
      (wrap-history)                                                                                                                                                      
      (wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))))                                                                  

答案可能很简单(可能与如何从中间件而不是请求返回响应有关)但我似乎无法为此找到正确的文档..

1 个答案:

答案 0 :(得分:0)

好吧,我错了,我误解了中间件的基础知识。我试图修改处理程序请求,而我应该修改返回的响应。

这是wrap-history的工作版本。它会检查现有会话的请求和响应,因为会话也可以在中间件之前被其他一些代码修改。

(defn wrap-history 
  "Middleware that stores last 20 visited urls in session"
  [handler]                                                                   
  (fn [req]                                                                                                                                                               
    (let [resp (handler req)                                                                                                                                              
          session (or (:session resp) (:session req))                                                                                                                     
          updated-session (assoc session :history                                                                                                                         
                                 (vec (take-last 20 (concat (:history session) [(request/request-url req)]))))]                                                           
      (assoc resp :session updated-session))))