Добавление CSRFToken в Ajax запрос
Мне нужно передать CSRFToken с Ajax-запросом на основе post, но не уверен, как это можно сделать наилучшим образом.
Использование платформы, которая внутренне проверяет CSRFToken в запросе (только POST request)
Изначально я думал добавить его в заголовок, как
$(function() {
$.ajaxSetup({
headers : {
'CSRFToken' : getCSRFTokenValue()
}
});
});
, который сделает его доступным для каждого запроса Ajax, но он не будет работать в моем случае, так как в запросе CSRFToken по-прежнему приходит как null.
Есть ли способ, которым я могу установить CSRFToken для всех вызовов Ajax, имеющих дело с POST тип
Edit
Если я сделаю что-то подобное в своем вызове Ajax
data: {"newsletter-subscription-email" : "XXX" , 'CSRFToken': getCSRFTokenValue()},
Все работает нормально.
моя проблема в том, что я хочу передать значение CSRFToken в качестве параметра запроса, а не в качестве заголовка запроса
8 ответов:
Как насчет этого,
$("body").bind("ajaxSend", function(elm, xhr, s){ if (s.type == "POST") { xhr.setRequestHeader('X-CSRF-Token', getCSRFTokenValue()); } });Ref: http://erlend.oftedal.no/blog/?blogid=118
Передать
CSRFв качестве параметра,$.ajax({ type: "POST", url: "file", data: { CSRF: getCSRFTokenValue()} }) .done(function( msg ) { alert( "Data: " + msg ); });
Вы можете использовать это:
var token = "SOME_TOKEN"; $.ajaxPrefilter(function (options, originalOptions, jqXHR) { jqXHR.setRequestHeader('X-CSRF-Token', token); });Из документации:
JQuery.ajaxPrefilter ([типы данных ], обработчик (параметры, originalOptions, jqXHR))
Описание: обработка пользовательских параметров Ajax или изменение существующих параметров перед отправкой каждого запроса и перед их обработкой $.Аякс().
Вот код, который я использовал, чтобы предотвратить проблему токена CSRF при отправке POST-запроса с ajax
$(document).ready(function(){ function getCookie(c_name) { if(document.cookie.length > 0) { c_start = document.cookie.indexOf(c_name + "="); if(c_start != -1) { c_start = c_start + c_name.length + 1; c_end = document.cookie.indexOf(";", c_start); if(c_end == -1) c_end = document.cookie.length; return unescape(document.cookie.substring(c_start,c_end)); } } return ""; } $(function () { $.ajaxSetup({ headers: { "X-CSRFToken": getCookie("csrftoken") } }); });});
Если вы работаете в узле.js с lusca попробуйте также это:
$.ajax({ url: "http://test.com", type:"post" headers: {'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')} })
Это сработало для меня (используя jQuery 2.1)
$(document).ajaxSend(function(elm, xhr, s){ if (s.type == "POST") { s.data += s.data?"&":""; s.data += "_token=" + $('#csrf-token').val(); } });Или вот это:
$(document).ajaxSend(function(elm, xhr, s){ if (s.type == "POST") { xhr.setRequestHeader('x-csrf-token', $('#csrf-token').val()); } });(где #csrf-токен-элемент, содержащий токен)
Из JSP
<form method="post" id="myForm" action="someURL"> <input name="csrfToken" value="5965f0d244b7d32b334eff840...etc" type="hidden"> </form>Это самый простой способ, который работал для меня после борьбы за 3 часа, просто получить маркер из входного скрытого поля, как это, и при выполнении запроса AJAX просто нужно передать этот маркер в заголовке следующим образом: -
Из Jquery
var token = $('input[name="csrfToken"]').attr('value');Из простого Javascript
var token = document.getElementsByName("csrfToken").value;Окончательный запрос AJAX
$.ajax({ url: route.url, data : JSON.stringify(data), method : 'POST', headers: { 'X-CSRF-Token': token }, success: function (data) { ... }, error: function (data) { ... }});
Теперь вам не нужно отключать crsf security в web config, а также это не даст вам 405 (метод не разрешен) ошибка на консоли.
Надеюсь, это поможет людям..!!
Ответ выше не сработал для меня.
Я добавил следующий код перед моим запросом ajax:
function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrftoken = getCookie('csrftoken'); function csrfSafeMethod(method) { // these HTTP methods do not require CSRF protection return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); } $.ajaxSetup({ beforeSend: function(xhr, settings) { if (!csrfSafeMethod(settings.type) && !this.crossDomain) { xhr.setRequestHeader("X-CSRFToken", csrftoken); } } }); $.ajax({ type: 'POST', url: '/url/', });
У меня была эта проблема в списке постов в блоге, пост находится в представлении внутри foreach, затем сложно выделить его в javascript, и проблема метода и токена post также существует.
Это код для javascript в конце представления, я генерирую токен в javascript functión внутри представления, а не во внешнем js-файле, затем легко использовать php lavarel, чтобы сгенерировать его с помощью функции csrf_token() и отправить метод "delete" непосредственно в params. Вы можете видеть, что я не использую в var route: {{маршрут ('пост.destroy', $post- > id}} поскольку я не знаю id, который я хочу удалить, пока кто-то не нажмет кнопку destroy, если у вас нет этой проблемы, вы можете использовать {{ route('post.уничтожить', $пост->идентификатор}} или другое подобное.
$(function(){ $(".destroy").on("click", function(){ var vid = $(this).attr("id"); var v_token = "{{csrf_token()}}"; var params = {_method: 'DELETE', _token: v_token}; var route = "http://imagica.app/posts/" + vid + ""; $.ajax({ type: "POST", url: route, data: params }); }); });И это код содержимого в поле зрения (внутри foreach есть больше форм и данных каждого поста, но не важно на этом примере), вы можете видеть, что я добавляю класс "delete" к кнопке и вызываю класс в javascript.
@foreach($posts as $post) <form method="POST"> <button id="{{$post->id}}" class="btn btn-danger btn-sm pull-right destroy" type="button" >eliminar</button> </form> @endforeach
Comments