2016-01-28 1 views
0

Comment modifier une session dans le middleware Ring? Je veux fondamentalement avoir un historique des URL consultées stockées là-bas et je ne peux pas obtenir la session pour stocker des valeurs.Anneau: Comment modifier une session dans le middleware

Les sessions fonctionnent correctement ailleurs dans le code où je peux retourner des réponses. Je suppose que cela a quelque chose à voir avec le problème et je ne comprends pas quelque chose sur le fonctionnement des middlewares.

Voici mon code actuel

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

Voici l'application (j'utilise anneau par défaut qui inclut le middleware de session)

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

La réponse est probablement assez facile (probablement quelque chose à faire avec la façon de retourner la réponse de middleware au lieu de la demande) mais je ne semble pas être en mesure de trouver la documentation correcte pour cela ..

Répondre

0

Okay J'étais correct t J'ai mal compris les bases du middleware. J'ai essayé de modifier la demande de gestionnaire alors que j'aurais dû modifier la réponse retournée.

Voici la version de travail de wrap-history. Il vérifie à la fois la requête et la réponse pour la session existante car la session peut également être modifiée par un autre code avant le middleware.

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