我正在使用Laravel 5应用程序,该应用程序默认为所有POST请求启用CSRF保护。我喜欢这种增加的安全性,因此我正在尝试使用它。
发出简单$.post()请求时,我收到一个'Illuminate\Session\TokenMismatchException'错误,因为_tokenPOST数据中缺少所需的表单输入。这是一个有关$ .post请求的示例:
$.post()
'Illuminate\Session\TokenMismatchException'
_token
var userID = $("#userID").val(); $.post('/admin/users/delete-user', {id:userID}, function() { // User deleted });
我将CSRF令牌存储为标头中的meta字段,可以使用以下命令轻松访问它:
var csrf_token = $('meta[name="csrf-token"]').attr('content');
是否可以在所有传出$.post()请求中将其附加到json数据?我尝试使用标头,但Laravel似乎无法识别它们-
var csrf_token = $('meta[name="csrf-token"]').attr('content'); alert(csrf_token); $.ajaxPrefilter(function(options, originalOptions, jqXHR){ if (options['type'].toLowerCase() === "post") { jqXHR.setRequestHeader('X-CSRFToken', csrf_token); } });
您的$.ajaxPrefilter方法是一种很好的方法。但是,您不需要添加标题。您只需要在data字符串中添加一个属性。
$.ajaxPrefilter
data
数据作为的第二个参数提供$.post,然后id=foo&bar=baz&...在预过滤器访问data选项之前格式化为查询字符串()。因此,您需要在查询字符串中添加自己的字段:
$.post
id=foo&bar=baz&...
var csrf_token = $('meta[name="csrf-token"]').attr('content'); $.ajaxPrefilter(function(options, originalOptions, jqXHR){ if (options.type.toLowerCase() === "post") { // initialize `data` to empty string if it does not exist options.data = options.data || ""; // add leading ampersand if `data` is non-empty options.data += options.data?"&":""; // add _token entry options.data += "_token=" + encodeURIComponent(csrf_token); } });
这将id=userID变成id=userID&_token=csrf_token。
id=userID
id=userID&_token=csrf_token