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