2016-01-28 26 views
0

如何修改Ring中间件中的会话?我基本上想要访问存储在那里的URL的历史记录,并且我不能让会话存储值。Ring:如何修改中间件中的会话

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

这里是我当前的代码

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

这里是应用程序(我使用的环默认设置,其中包括会话中间件)

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

答案可能是很容易的(可能的东西请问如何从中间件返回响应而不是请求),但我似乎无法找到正确的文档。

回答

0

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

这是工作版本的换行历史。它检查现有会话的请求和响应,因为会话可以在中间件之前由其他代码修改。

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