Php 如何在Laravel中的Ajax调用期间可靠地防止令牌失配异常?

Php 如何在Laravel中的Ajax调用期间可靠地防止令牌失配异常?,php,ajax,laravel,laravel-5.2,Php,Ajax,Laravel,Laravel 5.2,我知道以前有很多关于在Laravel中处理Ajax调用上的CSRF令牌的问题。Laravel文档将在任何Ajax请求上传递csrf_令牌值,如下所示: $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); 这正是我在我的应用程序中所做的 然而,仍然有很多情况下,TokenMismatchException被抛出

我知道以前有很多关于在Laravel中处理Ajax调用上的CSRF令牌的问题。Laravel文档将在任何Ajax请求上传递csrf_令牌值,如下所示:

$.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
});
这正是我在我的应用程序中所做的

然而,仍然有很多情况下,
TokenMismatchException
被抛出并登录到服务器上。我认为其中一个原因是:

  • 用户加载页面并使页面保持打开状态
  • Laravel会话过期
  • 用户返回PC并触发Ajax调用(例如,通过单击按钮)
  • Ajax调用从meta标记收集
    csrf令牌
  • 现在,调用时传递的
    csrf令牌
    值现在当然是错误的,因为Laravel会话不存在,需要重新生成

    Laravel文档也使用
    XSRF-TOKEN
    cookie。然而,cookie显然与
    laravel\u会话
    cookie的过期日期相同,这对我也没有帮助

    请注意,生成Ajax调用不一定要对用户进行身份验证,来宾用户可以触发这些调用,并且所有调用都会针对跨站点请求伪造进行检查

    在上述情况下,是否有办法避免出现
    令牌失配异常?

    旁注:


    我描述的案例可能不是唯一的一个。在过去的24小时内,异常被抛出并记录了36次,我确信这些事件不能都与同一问题联系在一起,特别是因为这些是各种Ajax调用—GET和POST。

    尝试使用Ajax传递令牌的另一种方法:

    $.ajax({
        type: 'POST',
        url: '/your/url',
    
        headers: {
            'X-CSRF-TOKEN': '{{ csrf_token() }}'
        },
    
        success: function (data) {
            //do something
        }
    });
    
    或者,您可以选择从CSRF保护中排除URI:

    通常,您应该将这些类型的路由放置在RouteServiceProvider应用于routes/web.php文件中所有路由的web中间件组之外。但是,您也可以通过将路由的URI添加到VerifyCsrfToken中间件的$Exception属性来排除路由:


    在添加ajax代码的页面中包括以下内容

    <input type="hidden" id="token" name="_token" value="<?php echo csrf_token();?>" />
    
    var token = $('#token').val();
    $.ajax({
           url: "your-url",
           method: "POST",
           data: {
             _token : token,
             required_fields: your-fields
           },
           success: function(result) {
             if(result.success == true) {
              // required action upon success
             }
           }
     });
    
    
    
    <input type="hidden" id="token" name="_token" value="<?php echo csrf_token();?>" />
    
    var token = $('#token').val();
    $.ajax({
           url: "your-url",
           method: "POST",
           data: {
             _token : token,
             required_fields: your-fields
           },
           success: function(result) {
             if(result.success == true) {
              // required action upon success
             }
           }
     });