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

Twi*_*ice 2 clojure compojure ring

我正在尝试编写一个自定义中间件,通过检查请求中是否存在以下内容来检查用户是否已通过身份验证.

(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))))
Run Code Online (Sandbox Code Playgroud)

但是当我尝试返回401状态的响应hashmap时,我得到以下异常: WARN:oejs.AbstractHttpConnection:/ main java.lang.ClassCastException:clojure.lang.Keyword无法强制转换为java.lang.String

也许我不理解在Compojure中间件中需要实现的逻辑.如何编写破坏中间件链的中间件,只返回自定义响应或重定向到处理程序?

Mic*_*oli 6

我相信你的情况是错误在:headers地图中,因为键应该是字符串而你正在使用:content-type,这是一个关键字.试试这个:

{"Content-Type" "text/html"}
Run Code Online (Sandbox Code Playgroud)