Laravel Token偶尔不匹配

时间:2015-07-10 20:11:54

标签: php jquery ajax laravel laravel-5

我有一个laravel应用程序,它在每个页面的字段中输出令牌。然后jquery将令牌加载到每个ajax请求,如下所示:Laravel 5 CSRF global token hidden field for all forms in a page

但每隔一段时间,我就会在ajax调用中获得TokenMismatch Exceptions。有时它会在网站闲置太久时发生,有时候它显然是随机的。

有关如何调试此问题的任何想法?可能导致这种情况或可能的解决方案的原因是什么?

4 个答案:

答案 0 :(得分:1)

我认为您不应该关闭Kernel.php文件上的VerifyCsrfToken中间件,因为此操作可能会引发攻击。实际上,您需要使用令牌保护您网站的每个请求(不包括外部帖子到我们网站的情况,例如:mandrill状态帖子)。

设置元标记如下

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

然后请求如下

$.ajax({
    data: {data1:'data1',data2:'data2'},
    url: '/your/url/goes/here',
    type: 'POST',
    beforeSend: function (request) {
        return request.setRequestHeader('X-CSRF-Token', $("meta[name='csrf-token']").attr('content'));
    },
    success: function(response){
        console.log(response);
    }
})

答案 1 :(得分:0)

如果您需要执行AJAX请求,请关闭 Kernel.php 文件中的 VerifyCsrfToken 中间件。

您还可以编辑 VerifyCsrfToken.php 中间件文件,以此方式排除某些网址:

/** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ 'ajax/*', 'api/*', ];

答案 2 :(得分:0)

发生这种情况的原因很可能是以下情况之一:

  1. 你已经闲置太久了 - 默认情况下,CSRF令牌有效期为15分钟,我没有弄错。

  2. 您忘记将令牌传递给后端。只需在您的请求中添加X-CSRF-TOKEN标头即可完成此操作。

答案 3 :(得分:0)

在主视图文件中添加以下html代码。

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

始终在JS文件或视图文件上使用以下脚本。

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});