这是我的客户端代码。我正在使用cljs-ajax进行POST
(defn persist-state []
(POST "/save" {:params {:state @state}))
这是我处理POST的服务器端代码。我正在使用compojure。
(POST "/save" req
(let [state (:state (req :params))]
(add-state! state)
{:status 200}))
当我触发ajax POST时,它会给出403禁止错误。我该如何解决这个问题?在网上找不到任何帮助我的东西。
编辑:我的中间件看起来像这样
(def app
(let [handler (wrap-defaults #'routes site-defaults)]
(if (env :dev) (-> handler wrap-exceptions wrap-reload) handler)))
这是由lein试剂模板生成的。我很确定我的问题与不设置反伪造令牌有关。
答案 0 :(得分:4)
有两种基本方法可以解决您的问题。哪种套装取决于您的应用以及您想要的内容。
选项1.如果您不想要CSRF保护,可以将其关闭。为此,您可以通过更改site-defaults映射来禁用它,也可以使用api-defaults而不是site defaults(默认情况下禁用csrf支持)。要关闭它,您可以执行类似
的操作(let [handler (wrap-defaults #'routes (assoc-in site-defaults [security :anti-forgery] false))]
.....)
选项2.您需要让服务器将当前令牌发送到您的客户端。对于静态表单,通常通过将令牌放在表单中的隐藏字段中来完成。对于使用javascript的动态内容,另一种选择是让服务器生成一个初始页面,该页面设置带有令牌的js变量。
Luminus模板有一个很好的例子,说明如何以灵活的方式处理这些令牌。它使用Selmar包作为模板,并添加一个表示csrf标记的新模板标记。