2016-01-28 3 views
0

Как изменить сеанс в промежуточном программном обеспечении Ring? Я в основном хочу иметь историю доступа к URL-адресам, хранящимся там, и я просто не могу заставить сеанс хранить значения.Кольцо: Как изменить сеанс в промежуточном программном обеспечении

Сессии корректно работают в другом месте в коде, где я могу возвращать ответы. Я предполагаю, что это имеет какое-то отношение к проблеме, и я не понимаю, как работает middlewares.

Вот мой текущий код

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