42

これは機能しますが、認証トークンがないため停止します。

$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script"});
  return false;
});

だから私はそれを次のように追加しようとしました:

$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, dataType: "script"});
  return false;
});

そして、auth_tokenをparamとして正しく渡しますが、残りのフォームが失われるようです。

とにかく、機能するフォームデータと認証トークンの送信の両方を達成するには?

これはレール環境です。そして、私はこれを私の頭の中に持っています。

= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery?

私が試したこと

1.

= hidden_field :authenticity_token, :value => form_authenticity_token

2.

$.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script", authenticity_token: AUTH_TOKEN});

3.

// Always send the authenticity_token with ajax
$(document).ajaxSend(function(event, request, settings) {
    if ( settings.type != 'GET' ) {
        settings.data = (settings.data ? settings.data + "&" : "")
            + "authenticity_token=" + encodeURIComponent( AUTH_TOKEN );
    }
});
4

8 に答える 8

33

実際にはaction、フォームの属性を読み取り、それにpostajaxリクエストを送信しています。フォームデータを送信するには、フォームを送信する必要があります。または、フォームデータをシリアル化して、次のようなajaxリクエストで送信することもできます。

$(".ajax-referral").click(function(){
  $.ajax({
      type: "POST", 
      url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, 
      data:$(this).parent("form").serialize(),
      dataType: "script"
      });
  return false;
});

これを行うと、フォームデータがシリアル化され、ajaxリクエストと一緒に送信されます。認証トークンは、クエリ文字列を介してすでに送信されています。

于 2011-09-27T12:40:28.397 に答える
33

This token also already appears in one of the "meta" tags in the head of the application.html.erb layout file by default if you have the following ERB at the top:

<%= csrf_meta_tag %>

That ERB roughly renders to:

<meta content="abc123blahblahauthenticitytoken" name="csrf-token">

You can then grab it using jQuery with the following code:

var AUTH_TOKEN = $('meta[name=csrf-token]').attr('content');
于 2013-11-17T23:21:37.757 に答える
30

X-CSRF-Token次のようにJSを介してリクエストヘッダーに値を設定するまで、これらのどれも機能しませんでした。

request.setRequestHeader('X-CSRF-Token', token)

tokenもちろん、CSRFトークンです。<meta name="csrf-token">タグから頂いたもので未使用ですencodeURIComponent()

これは一部の人にとって有用であることが証明されているため、更新します

つまり、全体として:

var token = document.querySelector('meta[name="csrf-token"]').content
request.setRequestHeader('X-CSRF-Token', token)
于 2015-03-16T20:52:51.120 に答える
15

ありがとう!

より一般的な使用法を明確にするためだけに。

頭の中にvarAUTH_TOKENを含むjsタグが必要です。このようなものでなければなりません。

<%= csrf_meta_tag %>
<%= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery? %>

そして、parent(form)などを使用する必要がない場合は、authenticity_token=AUTH_TOKENをajaxデータに入れるだけです。

$.ajax({
  type: 'post',
  dataType:'text',
  data: "user_id="+user_id+"&authenticity_token="+AUTH_TOKEN,
  url:'/follow/unfollow'
})

この知識を共有してくれた上記の人たちに感謝します!

于 2013-01-03T09:26:42.383 に答える
3

非表示の入力として、AUTH_TOKEN をフォーム自体に含めることができます。

<input type="hidden" name="AUTH_TOKEN">1234abcd</input>
于 2011-09-26T20:22:28.943 に答える
3

この問題に遭遇しましたが、application.js ファイルでこのアプローチを試しました。

$(document).ajaxSend(function(e, xhr, options) {
  if (options.data == null) {
    options.data = {};
  }
  options.data['authenticity_token'] = token;
});

これは、私がアイデアを得た元の質問です: ajaxSend Question

于 2013-05-10T03:20:57.063 に答える