【问题标题】:Ring: How to modify session in middlewareRing:如何在中间件中修改会话
【发布时间】:2023-03-28 04:54:02
【问题描述】:

如何在 Ring 中间件中修改会话?我基本上想有一个存储在那里的访问 url 的历史记录,我只是无法让会话存储值。

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

这是我当前的代码

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

这是应用程序(我使用的是包含会话中间件的 ring-defaults)

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

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

【问题讨论】:

    标签: clojure middleware ring


    【解决方案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))))                                                               
    

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 2011-01-11
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 2013-03-05
      • 1970-01-01
      相关资源
      最近更新 更多