将CSRFToken添加到Ajax请求
我需要通过CSRFToken
与基于Ajax的发布请求,但不知道如何以最好的方式完成。 使用在请求中内部检查CSRFToken
的平台(仅限POST请求)
最初我想把它添加到头像
$(function() { $.ajaxSetup({ headers : { 'CSRFToken' : getCSRFTokenValue() } }); });
这将使其可用于每个Ajax请求,但它不适用于我的情况,因为在请求CSRFToken
仍然为空。
有什么办法可以为所有处理POST
types的Ajax调用设置CSRFToken
编辑如果我在我的Ajax调用中做这样的事情
data: {"newsletter-subscription-email" : "XXX" , 'CSRFToken': getCSRFTokenValue()},
一切工作正常。
我的问题是,我想通过CSRFToken
值作为请求参数,而不是作为请求标题
这个怎么样,
$("body").bind("ajaxSend", function(elm, xhr, s){ if (s.type == "POST") { xhr.setRequestHeader('X-CSRF-Token', getCSRFTokenValue()); } });
参考: 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([dataTypes],处理程序(选项,originalOptions,jqXHR))
描述:处理自定义的Ajax选项,或者在发送每个请求之前以及在被$ .ajax()处理之前修改现有的选项。
读
这是我使用ajax发送POST请求时防止CSRF令牌问题的代码
$(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") } }); });
});
这工作对我来说(使用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-token是包含令牌的元素)
上面的答案对我不起作用。
我在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/', });
我在博客的post列表中有这个问题,post是在一个foreach里面的视图,然后很难在javascript中select它,并且post方法和令牌的问题也存在。
这个javascript的代码在视图结束时,我在javascript里面生成了令牌视图,而不是在外部的js文件中,那么很容易用php lavarel来生成它,用csrf_token()函数,并发送“delete “方法直接在params。 你可以看到我不使用var路由:{{route('post.destroy',$ post-> id}},因为我不知道我想删除的id,直到有人点击销毁button,如果你没有这个问题,你可以使用{{route('post.destroy',$ post-> id}}或其他类似的。
$(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里面有更多的表单和每个post的数据,但这个例子并不重要),你可以看到我添加一个类“删除”button,我在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
如果你正在使用lusca的node.js,请试试这个:
$.ajax({ url: "http://test.com", type:"post" headers: {'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')} })