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"}
我正在尝试编写自定义中间件,通过检查请求中是否存在 :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"}