从5.4升级到5.7,之后每个ajax发布请求为419,并带有:
{message: "", exception: "Symfony\Component\HttpKernel\Exception\HttpException",…}
exception: "Symfony\Component\HttpKernel\Exception\HttpException"
file: "pathto/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php"
line: 204
message: ""
trace: [{,…}, {file: "pathto/public_html/app/Exceptions/Handler.php", line: 47, function: "render",…},…]
0: {,…}
class: "Illuminate\Foundation\Exceptions\Handler"
file: "pathto/vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.php"
function: "prepareException"
line: 176
type: "->"
遵循尤其是有关Cookie序列化的升级说明:
protected static $serialize = true;
清除缓存,检查文件权限是否正常。下降到5.6,然后下降到5.5 laravel版本,但没有帮助。更改了cookie名称,尝试了隐身。试图甚至绕过所有:
protected $except = [
"*"
];
但是没有变化。这到底是怎么了?
修改:
Ajax调用:
var $_token = $('#token').val();
var url = '/delete';
$.ajax({
headers: {'X-XSRF-TOKEN': $_token},
type: "POST",
url: url,
data: ({data: data}), // set up earlier
success: function (data) {
}
});
控制器:
public function delete(Request $request)
{
$id = $request->input('data);
Post::where('id', $id)->delete();
}
还尝试了$('meta [name =“ csrf-token”]')。attr('content')
这给了我
payload is invalid
id令牌来自:
<?php
$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());
?>
<input id="token" type="hidden" value="{{$encrypted_token}}">
答案 0 :(得分:1)
在没有您的控制器和实际的ajax调用的情况下很难告诉...但是我遇到了与此419错误类似的问题。对我来说有两个原因:
1)令牌验证失败。要进行检查,请将其添加到您的ajax调用中:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
虽然...您尝试排除所有内容,但应该允许它通过(假设您在正确的位置放置了该行)。
编辑:如果您要通过JavaScript传递X-XSRF-TOKEN
,请使用decodeURIComponent()
2)您的控制器有可能试图在没有所有所需信息的情况下呈现视图。您是否有需要将变量发送到ajax控制器函数中的视图,并且丢失了?我以前意识到这是可行的,但对5.5进行了一些重大更改(包括如上所述处理CSRF的方式)。
3)只是我遇到的一个一般性错误,但是数据传输的方式可能与5.4相同。只需检查数据输入到控制器的方式是否没有错误。 IE在返回视图之前先从控制器进行转储,然后查看浏览器报告正在传输的内容
答案 1 :(得分:1)
只需添加
{{ csrf_field() }}
到刀片模板
类似
<form method="POST" action="/projects">
{{ csrf_field() }}
<div class="form-group">
<label for="title">Title</label>
<input id="title" class="form-control" type="text" name="title" placeholder="Project Title" required />
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">
Create Project
</button>
</div>
</form>
答案 2 :(得分:0)
旧话题,但是我现在回到原来的话题,并弄清楚了。
原因是我正在传递:较旧的Laravel中的XSRF-Token而不是CSRF-Token,从不版本似乎不再适用于XSRF。切换到CSRF并对其进行了修复。