我们有一个使用HttpKit来处理请求的Web应用程序,以及一个使用Ring中间件包装的处理程序。
该处理程序类似于:
(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服务的处理程序。
有什么方法可以有条件地应用防伪设置,或者site-defaults
根据请求提供不同版本的?
您可以使用ring.middleware.conditional
的运算符有条件地添加中间件。例如,要有条件地添加Jochen Bedersdorferapi-defaults
的评论中提到的内容:
(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)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句