Compojure中绕过链的自定义中间件

Custom middleware that bypasses chain in Compojure

我正在尝试编写自定义中间件,通过检查请求中是否存在 :user 密钥来检查用户是否已通过身份验证。

(defn wrap-authenticated [handler]
  (fn [{user :user :as req}]
    (if (nil? user)
      (do 
        (println "unauthorized")
        {:status 401 :body "Unauthorized." :headers {:content-type "text/text"}})
      (handler req))))

(def app
  (wrap-authenticated (wrap-defaults app-routes (assoc site-defaults :security false))))

但是当我尝试 return 响应具有 401 状态的 hashmap 时,出现以下异常: 警告:oejs.AbstractHttpConnection:/main java.lang.ClassCastException: clojure.lang.Keyword 无法转换为 java.lang.String

也许我不明白Compojure中间件内部需要实现的逻辑。 我如何编写打破中间件链的中间件,并且只是 return 的自定义响应或重定向到处理程序?

我认为您的情况错误出在 :headers 映射中,因为键应该是字符串,而您使用的是 :content-type,这是一个关键字。试试这个:

{"Content-Type" "text/html"}