我正在开发一个Laravel 5应用程序,该应用程序默认为所有POST请求启用了CSRF保护。我喜欢这种增加的安全性,所以我正在尝试使用它。
在发出一个简单的$.post()
请求时,我收到了一个'Illuminate\Session\TokenMismatchException'
错误,因为POST数据中缺少所需的表单输入_token
。下面是一个有问题的$.post请求的示例:
var userID = $("#userID").val();
$.post('/admin/users/delete-user', {id:userID}, function() {
// User deleted
});
我将CSRF令牌作为元字段存储在标头中,可以使用以下命令轻松地访问它:
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);
}
});
发布于 2015-02-10 03:48:29
您的$.ajaxPrefilter
方法是一个很好的方法。不过,您不需要添加标头;您只需要向data
字符串添加一个属性。
数据作为第二个参数提供给$.post
,然后在预筛选器访问data
选项之前格式化为查询字符串(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
。
发布于 2015-11-25 11:50:48
我认为上面的解决方案可能不会起作用。当你这样做的时候:
var x;
x + ""
// "undefined" + empty string coerces value to string
您将获得类似于"undefined_token=xxx“的数据
例如,当您使用上面的解决方案来删除laravel时,您必须像这样检查:
if (typeof options.data === "undefined")
options.data = "";
else
options.data += "&";
options.data = "_token=" + csrf_token;
发布于 2018-04-09 12:26:01
有一种更简单的方法可以在发送之前序列化数据
<form method="post" id="formData">
<input type="text" name="name" >
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="submit" id="sub" class="btn btn-default" value="Submit" />
</form>
<script>
$(document).on('submit', '#formData', function (event) {
event.preventDefault();
var formData = $('#formData').serialize();
$.ajax({
url: url,
type: "POST",
data : formData,
success: function (result) {
console.log(result);
}
});
});
});
</script>
名为attr的所有内容都将被放入查询并提交
https://stackoverflow.com/questions/28417781
复制相似问题