Clojure 环形防伪中间件是否可以有条件地应用?
我们有一个使用HttpKit服务请求的web应用程序和一个用环形中间件包装的处理程序 处理程序类似于:Clojure 环形防伪中间件是否可以有条件地应用?,clojure,ring,http-kit,Clojure,Ring,Http Kit,我们有一个使用HttpKit服务请求的web应用程序和一个用环形中间件包装的处理程序 处理程序类似于: (def handler (-> #'req-handler (wrap-defaults site-defaults) (wrap-content-type-and-encoding) (wrap-cookies) (wrap-stacktrace))) 在站点默认设置中,可以找到: :security { ...
(def handler
(-> #'req-handler
(wrap-defaults site-defaults)
(wrap-content-type-and-encoding)
(wrap-cookies)
(wrap-stacktrace)))
在站点默认设置中,可以找到:
:security { ...
:anti-forgery anti-forgery-setting
... }
该应用程序过去只服务于来自浏览器的请求,但现在一些端点响应API请求,包括POST操作
在文档中,我可以阅读:
该中间件将防止除GET和HEAD之外的所有HTTP方法在没有有效的防伪令牌的情况下访问处理程序
因此,您应该只将此中间件应用于设计为通过web浏览器访问的应用程序部分。此中间件不应应用于定义web服务的处理程序
是否有任何方法可以有条件地应用防伪设置,或根据请求提供不同版本的站点默认值?您可以使用的运算符有条件地添加中间件。例如,要有条件地添加中提到的api默认值
:
ring中有一组api默认值,您可以将其用于通向api端点的路由此示例非常完美,正是我所需要的。非常感谢!。
(require '[ring.middleware.conditional :as middleware.conditional]
(require '[ring.middleware.defaults :refer [api-defaults site-defaults])
(defn wrap-api-defaults [handler]
(wrap-defaults handler api-defaults))
(defn wrap-site-defaults [handler]
(wrap-defaults handler site-defaults))
(def handler
(-> #'req-handler
(middleware.conditional/if-url-starts-with "/api" wrap-api-defaults)
(middleware.conditional/if-url-doesnt-start-with "/api" wrap-site-defaults)
(wrap-content-type-and-encoding)
(wrap-cookies)
(wrap-stacktrace)))