【问题标题】:how to do ajaxSetup beforeSend like stuff in DOJO toolkit to provide CSRF token in DOJO AJAX POSTs如何在 DOJO 工具包中发送类似的东西之前执行 ajaxSetup 以在 DOJO AJAX POST 中提供 CSRF 令牌
【发布时间】:2011-08-30 08:14:44
【问题描述】:

最近发布的 Django 要求 csrf_token 与每个 POST 请求一起发送(无论是通过 AJAX 还是通过普通请求)。

Flaw in CSRF handling fixed.

他们建议,Django 现在将接受自定义 HTTP 标头 X-CSRFTOKEN 以及表单提交本身中的 CSRF 令牌,以便与流行的 JavaScript 工具包一起使用,这些工​​具包允许将自定义标头插入所有 AJAX 请求.

他们在 jQuery 中给出了一个例子

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
            // Only send the token to relative URLs i.e. locally.
            xhr.setRequestHeader("X-CSRFToken",
                                 $("#csrfmiddlewaretoken").val());
        }
    }
});

我无法弄清楚如何在 DOJO 工具包中做类似的事情。 我一直在使用 dojo.rpc.JsonService() 一段时间。

请建议一种在 DOJO 中做类似事情的方法?

或者唯一的选择是分别对每个 xhrPost 请求执行此操作?

【问题讨论】:

    标签: ajax django dojo csrf


    【解决方案1】:

    免责声明:我不熟悉 django。

    除了扩展基础 dojo xhr 定义(不推荐)之外,我想说您可能想要扩展 dojo.xhr 或构建一个实用方法。

    实用程序方法会混合或设置您传递给 dojo.xhr 的参数的“headers”属性:

    myCustomNameSpace.xhr = 函数 (xhrArgs) {
    var csrfHeader = { "X-CSRFToken" : dojo.byId(csrfmiddlewaretoken).val(); }; xhrArgs.headers?dojo.mixin(xhrArgs.headers,csrfHeader):xhrArgs.headers=csrfHeader; dojo.xhrPost(xhrArgs);
    };

    通过 myCustomNameSpace.xhr({method:"POST",url:"http://www....."});

    调用

    【讨论】:

      【解决方案2】:

      {% csrf_token %} 会以如下形式出现:

      <input type='hidden' name='csrfmiddlewaretoken' value='...' />
      

      所以只需像这样混合您的内容:

      var form = dojo.byId("postForm");
      dojo.xhrPost({url:form.action,
          content:{text:form.text.value, csrfmiddlewaretoken:form.csrfmiddlewaretoken.value},
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-18
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 2021-06-16
        相关资源
        最近更新 更多