首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cljs-ajax POST给出403

cljs-ajax POST给出403
EN

Stack Overflow用户
提问于 2015-11-05 04:13:07
回答 1查看 813关注 0票数 2

这是我的客户端代码。我在POST中使用cljs-ajax

代码语言:javascript
复制
(defn persist-state []
  (POST "/save" {:params {:state @state}))

这是我的服务器端代码,用来处理POST。我正在使用compojure。

代码语言:javascript
复制
(POST "/save" req
      (let [state (:state (req :params))]
           (add-state! state)
           {:status 200}))

当我触发ajax POST时,它给出了一个403禁止的错误。我该如何解决这个问题呢?在网上找不到任何能帮我的东西。

编辑:我的中间件看起来像这样

代码语言:javascript
复制
(def app                                                                        
  (let [handler (wrap-defaults #'routes site-defaults)]                         
    (if (env :dev) (-> handler wrap-exceptions wrap-reload) handler)))

这是从lein试剂模板中产生的。我相当确定我的问题与没有设置防伪令牌有关。

EN

回答 1

Stack Overflow用户

发布于 2015-11-08 10:46:53

有两种基本的方法可以解决你的问题。哪种套装取决于你的应用程序和你想要的。

选项1.如果您不需要CSRF保护,可以将其关闭。为此,您可以通过更改site-defaults映射来禁用它,也可以使用api-defaults而不是site defaults (默认情况下禁用csrf支持)。要关闭它,您可以执行以下操作

代码语言:javascript
复制
(let [handler (wrap-defaults #'routes (assoc-in site-defaults [security :anti-forgery] false))]  
  .....)

选项2.您需要让服务器将当前令牌发送给您的客户端。对于静态表单,这通常是通过将令牌放在表单内的隐藏字段中来完成的。对于使用javascript的动态内容,另一种选择是让服务器生成一个初始页面,该页面设置一个带有令牌的js变量。

对于如何以灵活的方式处理这些标记,Luminus模板提供了一个非常好的示例。它使用Selmar包作为模板,并添加一个新的模板标记来表示csrf令牌。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33531135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档