【问题标题】:REST API CORS error when trying to access it from a web application尝试从 Web 应用程序访问时出现 REST API CORS 错误
【发布时间】:2019-11-09 00:19:54
【问题描述】:

我正在开发一个带有 re-frame (lein new re-frame <app-name> +routes) 的网络应用程序,现在我想从数据库中获取数据。由于我使用的是 Clojurescript,因此我考虑使用 Clojure (lein new luminus <api-name> +postgres +service) 创建一个 API 并连接到我的 Postgres 数据库。

虽然两个应用程序都可以运行,但 AJAX 请求由于 CORS 错误而失败。

我的 re-frame 应用在 localhost:3449 上运行,我的 API 应用在 localhost:3000/api 上运行。

我怎样才能克服这个错误?我不知道把{"Access-Control-Allow-Origin" "*"}放在哪里

【问题讨论】:

    标签: database rest clojure cors clojurescript


    【解决方案1】:

    在 Clojure Reddit 上的 squiresuzuki 的帮助下,他让我阅读了有关中间件的信息,我通过创建一个添加必要的标头以允许跨源请求的中间件来使这个 API 工作。

    在文件middleware.clj 中我已更改为以下内容:

    (defn wrap-cors
      "Wrap the server response with new headers to allow Cross Origin."
      [handler]
      (fn [request]
        (let [response (handler request)]
          (-> response
              (assoc-in [:headers "Access-Control-Allow-Origin"] "http://localhost:3449")
              (assoc-in [:headers "Access-Control-Allow-Headers"] "x-requested-with, content-type")
              (assoc-in [:headers "Access-Control-Allow-Methods"] "*")))))
    
    (defn wrap-base [handler]
      (-> ((:middleware defaults) handler)
          (wrap-cors) ; enable CORS
          (wrap-defaults
           (-> site-defaults
               (assoc-in [:security :anti-forgery] false)
               (assoc-in [:session :store] (ttl-memory-store (* 60 30)))))))
    

    【讨论】:

    • 您可以通过 (get-in request [:headers "origin"]) 获取它,而不是硬编码请求 url http://localhost:3449 还可以为原始 url 添加某种白名单程序,这样在将其投入生产时会更安全
    猜你喜欢
    • 2021-10-30
    • 2021-09-24
    • 1970-01-01
    • 2018-09-02
    • 2019-09-28
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多