新手问题 [已解决] 提交使用 js 动态创建的表单,如何添加 CSRF_TOKEN?

deathking · 2014年08月28日 · 最后由 DeathKing 回复于 2014年08月29日 · 10109 次阅读

因为某些原因,我需要用js创建一个form,然后自行提交,但是遇到InvalidAuthenticityToken

不是Ajax提交。关键代码如下,页面里面有个button,然后点击时执行testPost()

// from https://stackoverflow.com/questions/133925/javascript-post-request-like-a-form-submit
function post(path, params, method) {
    method = method || "post"; // Set method to post by default if not specified.

    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    for(var key in params) {
        if(params.hasOwnProperty(key)) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
         }
    }

    document.body.appendChild(form);
    form.submit();
}

function testPost() {
    post("/books", {foo: "bar"});
}

解决方案:

在post中加入authenticity_token项,其值是head中的元数据csrf-token的值(由Rails生成)。

var token = $('meta[name="csrf-token"]').attr('content');
共收到 6 条回复

CSRF_TOKEN 在 html 的 head 中, 用 js 抽取 或者 直接禁用 CSRF_TOKEN

#1楼 @hardywu 我的意思是,抽取的话应该放在哪里?我google过,Ajax请求的话,Rails会自动抽取token放到Request里面。但是我这种方式我就不太清楚了。

实际上我比较疑惑的是,document.body.appendChild(form);明显是把我创建的form放在了原网页中再提交的,按理说还是有CSRF_TOKEN的啊!

添加到post数据里面,案例https://ruby-china.org/topics/21120

没错。

为什么不用 $.post

#3楼 @flowerwrong 看了你的代码,豁然开朗。确实有效,感激不尽!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册