这是我的客户端代码。我在POST中使用cljs-ajax
(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试剂模板中产生的。我相当确定我的问题与没有设置防伪令牌有关。
发布于 2015-11-08 10:46:53
有两种基本的方法可以解决你的问题。哪种套装取决于你的应用程序和你想要的。
选项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令牌。
https://stackoverflow.com/questions/33531135
复制相似问题