Кольцо: как изменить сеанс в промежуточном программном обеспечении

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

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

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

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

Ответ, вероятно, довольно прост (вероятно, это связано с тем, как вернуть ответ от промежуточного программного обеспечения вместо запроса), но я просто не могу найти правильную документацию для этого ..


person mikkom    schedule 28.01.2016    source источник


Ответы (1)


Хорошо, я был прав, что неправильно понял основы промежуточного программного обеспечения. Я попытался изменить запрос обработчика, тогда как мне следовало изменить возвращенный ответ.

Вот рабочая версия 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))))                                                               
person mikkom    schedule 28.01.2016