我最近开始探索 Clojure,我想设置一个具有基本 CRUD 功能的简单 Web 应用程序。我在这里找到了一个不错的教程:http://www.xuan-wu.com/2013-09-21-Basic-Web-Application-in-Clojure .
GET 请求工作正常,但每当我尝试发布请求时,我都会收到以下错误:
Invalid anti-forgery token
我之前提到的教程没有解决任何与安全相关的问题。我做了一些挖掘,似乎我缺少 Compojure 的某些组件,该组件应该生成用于发出 POST 请求的 token 。有些地方提到我应该自动发生,而我没有任何改变。我仍然不确定我错过了什么。这是我的代码:
(ns myblog.handler
(:require [compojure.core :refer :all]
[compojure.route :as route]
[ring.middleware.defaults :refer [wrap-defaults site-defaults]]
[myblog.views :as views]
[myblog.posts :as posts]
[ring.util.response :as resp]
[ring.middleware.basic-authentication :refer :all]))
(defn authenticated? [name pass]
(and (= name "user")
(= pass "pass")))
(defroutes public-routes
(GET "/" [] (views/main-page))
(route/resources "/"))
(defroutes protected-routes
(GET "/admin" [] (views/admin-page))
(GET "/admin/add" [] (views/add-post))
(POST "/admin/create" [& params]
(do (posts/create params)
(resp/redirect "/admin"))))
(defroutes app-routes
public-routes
(wrap-basic-authentication protected-routes authenticated?)
(route/not-found "Not Found"))
(def app
(wrap-defaults app-routes site-defaults))
同样,只有 POST 请求“/admin/create”因无效 token 错误而失败。知道我做错了什么吗?
最佳答案
您的问题在于 wrap-defaults 和 site-defaults 设置。 site-defaults 默认配置添加了 ant9forgery CSRF 保护,任何不包含有效 CSRF-token 的 post 请求都将被阻止。
有几种方法可以解决这个问题
(wrap-defaults app-routes (assoc-in site-defaults [:security :anti-forgery] false))
关于post - 无法在 Clojure 中完成 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33132131/