2014-02-27 105 views
24

我需要通过CSRFToken与基于Ajax的发布请求,但不知道如何以最佳方式完成此操作。 使用一个平台,它的内部检查要求CSRFToken(POST唯一的要求)将CSRFToken添加到Ajax请求

起初我想将它添加到头部像

$(function() { 
    $.ajaxSetup({ 
     headers : { 
      'CSRFToken' : getCSRFTokenValue() 
     } 
    }); 
}); 

这将使它可用于每个Ajax请求,但不会为我的案件工作,因为在请求CSRFToken仍然是空的。

有什么办法,我可以设置CSRFToken所有Ajax调用处理POST

编辑 如果我做这样的事情在我的Ajax调用

data: {"newsletter-subscription-email" : "XXX" , 'CSRFToken': getCSRFTokenValue()}, 

一切工作正常。

我的问题是,我想通过CSRFToken值作为请求参数,而不是作为一个请求头

+0

因此,头被传递,但令牌为空? getCSRFTokenValue()'做了什么? –

+0

@RobinJonsson:这只是获取令牌的价值 –

+0

我面临同样的问题(需要通过基于Ajax的CSRF令牌,但只使用JS。我不熟悉JQuery :( – shahz

回答

24

这个怎么样,

$("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); 
     }); 
+0

谢谢,尽管值得通过,但它没有在请求中提供,这是它从服务器端request.getParameter(CSRF_PARAM_NAME)' –

+0

'request.getParameter(CSRF)'请求在服务器端获取请检查我更新的答案 –

+0

谢谢!!,我知道这种方式,但在这种情况下,这意味着我需要添加这个到每个Ajax调用,我将在我的应用程序中做 –

5

您可以使用此:

var token = "SOME_TOKEN"; 

$.ajaxPrefilter(function (options, originalOptions, jqXHR) { 
    jqXHR.setRequestHeader('X-CSRF-Token', token); 
}); 

从技术文档:

jQuery.ajaxPrefilter([数据类型],处理(选项,originalOptions, jqXHR))

说明:处理自定义Ajax选项或修改现有选项 ,然后再发送每个请求,并由$ .ajax()处理它们。

Read

+0

谢谢,虽然值正在通过,但它在请求中不可用,这是如何从服务器端请求中获取'request.getParameter(CSRF_PARAM_NA ME)' –

+0

@UmeshAwasthi你使用node.js? –

+0

不,我为此使用Jquery –

3

这里是代码,我使用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") 
      } 
     }); 
    }); 

})发送POST请求时,以防止跨站请求伪造令牌问题;

+0

我使用了getCookie函数。它是有益的。谢谢 – BAE

1

这对我有用(使用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令牌是包含令牌元件)

0

答案上面没有为我工作。

我下面的代码添加我的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/', 
      }); 
0

我在帖子在博客列表这个问题,后是在foreach内部的视图,那么很难在选择它JavaScript,并且post方法和令牌的问题也存在。

这是javascript的代码在视图结束时,我在视图内部生成了javascript函数中的令牌,而不是在外部js文件中,然后很容易使用php lavarel使用csrf_token()函数生成它,并且直接在params中发送“delete”方法。 你可以看到我不使用var路由:{{route('post.destroy',$ post-> id}},因为我不知道我想删除的id,直到有人点击销毁按钮,if你没有必要这个问题,你可以使用{{路线(“post.destroy”,$后> 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还有更多的形式和每个岗位的数据,但它不是这个例子inportant),你可以看到我添加一个类“删除”按钮,然后我叫类的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 
2

如果你在工作lusca的node.js也试试这个:

$.ajax({ 
url: "http://test.com", 
type:"post" 
headers: {'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')} 
})