Laravel 5.6的419 Ajax错误-已编辑

时间:2018-07-10 16:02:04

标签: php jquery ajax laravel

我在PHP 7.2上有多个Laravel 5.6页面

直到今天早上,当我使用另一台计算机登录时,一切都很好。我把我的CSRF令牌放在头上,并按照文档中的说明将其用于ajax。再次-页面起作用,直到我在另一台计算机上登录为止。

现在我的Ajax出现419错误。我查看了我的GIT提交,发现关于javascript和head模板没有任何改变。

对我来说,这显然是令牌不匹配或身份验证问题。但是我该如何调试?服务器端未生成任何错误,并且从ajax返回的错误是

  

例外:“ Symfony \ Component \ HttpKernel \ Exception \ HttpException”
文件:“ E:\ InetPub \ LegacyLogin \ LegacyLogin \ vendor \ laravel \ framework \ src \ Illuminate \ Foundation \ Exceptions \ Handler.php”   
line:203   
消息:“”

我有:

  • 在config / sessions.php中检查超时
  • 检查了csrf标头 文档
  • 试图将CSRF令牌放入隐藏的输入中
  • 删除我的cookie
  • 注销/登录
  • 重新启动IIS

我陷入僵局。

这是过去3周内有效的代码,直到今天当我从另一台计算机登录时。

Javascript / Jquery ajax调用:

$.ajax({
    url: "/app/personrep",
    type: "POST",
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        },
    data: JSON.stringify(data),
    contentType: "application/json; charset=utf-8",
    success: ()=>{            
        //window.location='/myinfo';
    },
    error: function(e) {
        console.log(e);
    }
});

在app.blade.php模板头中:

<!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">

有人可以指出我的方向吗?我什至已经拍摄了其中一个文件(视图),并根据此处和Laracast的每个建议对其进行了更改...

更新: 下面提供的排除方法起作用了...因此,我有2个json字符串-一个出现了应有的工作,另一个导致CSRF出现问题。

---我使系统恢复工作。但是我不知道发生了什么。我使用模型将JSON字符串存储在MySQL数据库中,并且之前,我从其中手动删除了一个对象。 我在再次手动将其插入数据库之前验证了JSON,奇怪的是,它影响了多个页面。如果是JSON错误,则应该在呈现视图期间显示。

让我感到放心的是,我需要知道这个应用程序投入生产之前发生了什么。 JSON非常大,但是如果它可以帮助某人帮助我诊断错误,我会发布它。

2 个答案:

答案 0 :(得分:2)

尝试使用此命令查看是否是csrf引起的问题。在中间件的VerifyCsrfToken.php中,排除该路由,即

protected $except = [
        //
    '/app/personrep',
    'app/personrep'
];

答案 1 :(得分:0)

我发现了问题。在测试期间使用我的ajax调用之一,我错误地在对象中插入了“ _token”属性。直到我登录到另一台计算机,显然会生成新令牌为止,此方法才起作用。

我将对象从视图中来回传递给控制器​​,然后进行建模-一个整洁的包...

所以我学到了并且想传递的是ajax调用的data属性中的“ _token” 即:

$.ajax({
    url: "/app/personrep",
    type: "POST",
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        },
    data: {"_token":"asfbgasdfhba"},
    contentType: "application/json; charset=utf-8",
    success: ()=>{            
        //window.location='/myinfo';
    },
    error: function(e) {
        console.log(e);
    }
});

将始终覆盖标头中设置的令牌.....