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

时间:2016-05-11 06:52:50

标签: 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))))

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

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

1 个答案:

答案 0 :(得分:6)

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

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