cljs-ajax POST给403

时间:2015-11-04 20:13:07

标签: ajax clojure clojurescript compojure

这是我的客户端代码。我正在使用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试剂模板生成的。我很确定我的问题与不设置反伪造令牌有关。

1 个答案:

答案 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标记的新模板标记。