3

我们有一个使用 HttpKit 服务请求的 Web 应用程序和一个用 Ring 中间件包装的处理程序。

处理程序类似于:

(def handler
  (->  #'req-handler
    (wrap-defaults site-defaults)
    (wrap-content-type-and-encoding)
    (wrap-cookies)
    (wrap-stacktrace)))

在 site-defaults 中可以找到:

 :security  { ...
              :anti-forgery         anti-forgery-setting
              ... }

该应用程序过去只处理来自浏览器的请求,但现在一些端点响应 API 请求,包括 POST 操作。

在我可以阅读的文档中:

此中间件将阻止除 GET 和 HEAD 之外的所有 HTTP 方法在没有有效防伪令牌的情况下访问您的处理程序。

因此,您应该只将此中间件应用于旨在通过 Web 浏览器访问的应用程序部分。此中间件不应应用于定义 Web 服务的处理程序。

有没有办法有条件地应用防伪设置,或者site-defaults根据请求提供不同版本的防伪设置?

4

1 回答 1

4

您可以使用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)))

于 2019-08-08T20:32:53.733 回答