Php Laravel中Ajax请求的令牌不匹配错误

Php Laravel中Ajax请求的令牌不匹配错误,php,laravel,laravel-5.2,Php,Laravel,Laravel 5.2,当我提交表单时,Ajax提交中出现了TokenMismatch错误。这里我使用的是Laravel 5.2。我在ajax调用中传递X-CSRF-TOKEN。在default.blade.php上的meta上设置令牌。我已经尝试了StackOverflow中所有可能的解决方案 正在更改存储文件夹的权限 试图清除缓存 尝试添加Route::group(['middleware'=>['web','auth']],function(){ 将token添加到ajax函数的头中 尝试在表单中添加标记字段 任

当我提交表单时,Ajax提交中出现了
TokenMismatch
错误。这里我使用的是
Laravel 5.2
。我在ajax调用中传递
X-CSRF-TOKEN
。在
default.blade.php
上的meta上设置令牌。我已经尝试了
StackOverflow
中所有可能的解决方案

  • 正在更改存储文件夹的权限
  • 试图清除缓存
  • 尝试添加
    Route::group(['middleware'=>['web','auth']],function(){
  • token
    添加到ajax函数的头中
  • 尝试在表单中添加
    标记
    字段
  • 任何人都可以从下面的代码中找到任何解决方案

    知道我哪里出错了吗?如果有任何帮助,我们将不胜感激

    下面是我的分类HTML表单
    Category.blade.php

    <form method="POST" name="category-add-form" id="category-add-form" action="{{route("category-add")}}" accept-charset="UTF-8">
        {{csrf_field()}}
        <div class="form-group">
            <label for="title">Category Title:</label>
            <input class="form-control" name="category_title" type="text" value="" id="category_title">
        </div>
        <div class="form-group">
            <label for="body">Description:</label>
            <textarea class="form-control" name="category_description" cols="50" rows="10" id="category_description"></textarea>
        </div>
        <div class="form-group">
            <input class="btn btn-primary form-control" type="submit" value="Add CAtegory">
        </div>
    </form>
    
    下面是我的
    category add.js
    ,这是我的ajax代码。我还没有包括整个函数

    var request;
    var $inputs = $("#category-add").find("input, select, button, textarea");
    var formData = new FormData($("#category-add")[0]);
    request = $.ajax({
        url: $("#category-add").attr("action"),
        type: "POST",
        data: formData,
        processData: false,
        contentType: false,
        dataType: "json",
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
    
    request.done(function (response, textStatus, jqXHR) {
        //Notification.init(response.message);
        //App.unblockUI('.block-panel-box');
    });
    request.error(function (response, textStatus, jqXHR) {
        //App.unblockUI('.block-panel-box');
    });
    request.always(function () {
        $inputs.prop("disabled", false);
    });
    
    下面是我的
    default.blade.php

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8" />
            <title>Test Project</title>
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta content="width=device-width, initial-scale=1" name="viewport" />
            <meta name="csrf-token" content="{{csrf_token()}}">
            <link href="http://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700&subset=all" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/font-awesome.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/simple-line-icons.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/bootstrap.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/components-md.min.css")}}" rel="stylesheet" id="style_components" type="text/css" />
            <link href="{{asset("public/css/plugins-md.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/layout.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/blue.min.css")}}" rel="stylesheet" type="text/css" id="style_color" />
            <link href="{{asset("public/css/responsive.css")}}" rel="stylesheet" type="text/css" />
            <link rel="shortcut icon" href="favicon.ico" />
        </head>
        <body class="page-header-fixed page-sidebar-closed-hide-logo page-container-bg-solid page-sidebar-closed page-md">
            @include('user.layout.header')
            <div class="clearfix"> </div>
            <div class="page-container">
                @include('user.layout.sidebar')
                <div class="page-content-wrapper">
                    @yield('content')
                </div>
            </div>
            @include('user.layout.footer')
            <div class="quick-nav-overlay"></div>
            <script src="{{asset("public/js/jquery.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/bootstrap.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/jquery.slimscroll.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/app.min.js")}}" type="text/javascript"></script>
    <script src="{{asset("public/js/category-add.js")}}" type="text/javascript"></script>
        </body>
    </html>
    
    Route::group(['middleware' => ['web','auth']], function () {
        Route::post('/category-add', array("as" => "category-add","uses" => "CategoryController@store"));
    });
    
    class CategoryController extends Controller {
        public function store(Request $request) {
            $inputs = $request->all();
            $category = Category::create($inputs);
            if($category){
                $responseArray = array("status"=>true,"message"=>"Category successfully created");
            } else {
                $responseArray = array("status"=>false,"message"=>"Could not add category please try again later");
            }
            return response()->json($responseArray);
        }
    }
    
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    
        'api' => [
            'throttle:60,1',
        ],
    ];
    
    下面是我的
    CategoryController.php

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8" />
            <title>Test Project</title>
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta content="width=device-width, initial-scale=1" name="viewport" />
            <meta name="csrf-token" content="{{csrf_token()}}">
            <link href="http://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700&subset=all" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/font-awesome.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/simple-line-icons.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/bootstrap.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/components-md.min.css")}}" rel="stylesheet" id="style_components" type="text/css" />
            <link href="{{asset("public/css/plugins-md.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/layout.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/blue.min.css")}}" rel="stylesheet" type="text/css" id="style_color" />
            <link href="{{asset("public/css/responsive.css")}}" rel="stylesheet" type="text/css" />
            <link rel="shortcut icon" href="favicon.ico" />
        </head>
        <body class="page-header-fixed page-sidebar-closed-hide-logo page-container-bg-solid page-sidebar-closed page-md">
            @include('user.layout.header')
            <div class="clearfix"> </div>
            <div class="page-container">
                @include('user.layout.sidebar')
                <div class="page-content-wrapper">
                    @yield('content')
                </div>
            </div>
            @include('user.layout.footer')
            <div class="quick-nav-overlay"></div>
            <script src="{{asset("public/js/jquery.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/bootstrap.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/jquery.slimscroll.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/app.min.js")}}" type="text/javascript"></script>
    <script src="{{asset("public/js/category-add.js")}}" type="text/javascript"></script>
        </body>
    </html>
    
    Route::group(['middleware' => ['web','auth']], function () {
        Route::post('/category-add', array("as" => "category-add","uses" => "CategoryController@store"));
    });
    
    class CategoryController extends Controller {
        public function store(Request $request) {
            $inputs = $request->all();
            $category = Category::create($inputs);
            if($category){
                $responseArray = array("status"=>true,"message"=>"Category successfully created");
            } else {
                $responseArray = array("status"=>false,"message"=>"Could not add category please try again later");
            }
            return response()->json($responseArray);
        }
    }
    
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    
        'api' => [
            'throttle:60,1',
        ],
    ];
    
    下面是我的
    .env
    文件

    APP_ENV=local
    APP_DEBUG=true
    APP_KEY=base64:ratSluNv930gb3wp1UOabW6Ze3jEJn3ixtTX/wgqYZc=
    APP_URL=http://project.dev/ts/cart-products
    
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=cart-products
    DB_USERNAME=hellocart
    DB_PASSWORD=j@yshre33r@m
    
    CACHE_DRIVER=file
    SESSION_DRIVER=file
    QUEUE_DRIVER=sync
    
    return [
        'driver' => env('SESSION_DRIVER', 'file'),
        'lifetime' => 120,
        'expire_on_close' => false,
        'encrypt' => false,
        'files' => storage_path('framework/sessions'),
        'connection' => null,
        'table' => 'sessions',
        'lottery' => [2, 100],
        'cookie' => 'cart-products',
        'path' => '/ts/cart-products', //Change path variable URL form '/cart-products' to '/ts/cart-products'
        'domain' => null,
        'secure' => false,
        'http_only' => true,
    ];
    
    下面是我的
    config/session.php
    文件

    APP_ENV=local
    APP_DEBUG=true
    APP_KEY=base64:ratSluNv930gb3wp1UOabW6Ze3jEJn3ixtTX/wgqYZc=
    APP_URL=http://project.dev/ts/cart-products
    
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=cart-products
    DB_USERNAME=hellocart
    DB_PASSWORD=j@yshre33r@m
    
    CACHE_DRIVER=file
    SESSION_DRIVER=file
    QUEUE_DRIVER=sync
    
    return [
        'driver' => env('SESSION_DRIVER', 'file'),
        'lifetime' => 120,
        'expire_on_close' => false,
        'encrypt' => false,
        'files' => storage_path('framework/sessions'),
        'connection' => null,
        'table' => 'sessions',
        'lottery' => [2, 100],
        'cookie' => 'cart-products',
        'path' => '/ts/cart-products', //Change path variable URL form '/cart-products' to '/ts/cart-products'
        'domain' => null,
        'secure' => false,
        'http_only' => true,
    ];
    
    下面是我的
    Kernal.php

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8" />
            <title>Test Project</title>
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta content="width=device-width, initial-scale=1" name="viewport" />
            <meta name="csrf-token" content="{{csrf_token()}}">
            <link href="http://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700&subset=all" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/font-awesome.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/simple-line-icons.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/bootstrap.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/components-md.min.css")}}" rel="stylesheet" id="style_components" type="text/css" />
            <link href="{{asset("public/css/plugins-md.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/layout.min.css")}}" rel="stylesheet" type="text/css" />
            <link href="{{asset("public/css/blue.min.css")}}" rel="stylesheet" type="text/css" id="style_color" />
            <link href="{{asset("public/css/responsive.css")}}" rel="stylesheet" type="text/css" />
            <link rel="shortcut icon" href="favicon.ico" />
        </head>
        <body class="page-header-fixed page-sidebar-closed-hide-logo page-container-bg-solid page-sidebar-closed page-md">
            @include('user.layout.header')
            <div class="clearfix"> </div>
            <div class="page-container">
                @include('user.layout.sidebar')
                <div class="page-content-wrapper">
                    @yield('content')
                </div>
            </div>
            @include('user.layout.footer')
            <div class="quick-nav-overlay"></div>
            <script src="{{asset("public/js/jquery.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/bootstrap.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/jquery.slimscroll.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/app.min.js")}}" type="text/javascript"></script>
    <script src="{{asset("public/js/category-add.js")}}" type="text/javascript"></script>
        </body>
    </html>
    
    Route::group(['middleware' => ['web','auth']], function () {
        Route::post('/category-add', array("as" => "category-add","uses" => "CategoryController@store"));
    });
    
    class CategoryController extends Controller {
        public function store(Request $request) {
            $inputs = $request->all();
            $category = Category::create($inputs);
            if($category){
                $responseArray = array("status"=>true,"message"=>"Category successfully created");
            } else {
                $responseArray = array("status"=>false,"message"=>"Could not add category please try again later");
            }
            return response()->json($responseArray);
        }
    }
    
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
        ],
    
        'api' => [
            'throttle:60,1',
        ],
    ];
    

    我认为你应该在数据中注入“_token”,然后发送。就像那样

    data : {
    '_token' : "{{ csrf_token() }}",
    'data'   : formData
    }
    
    我会尝试删除category-add.js中的“helpers”条目,然后将“ajaxSetup”复制到同一个文件中,bevor发送ajax请求。

    按照以下步骤操作

    <div class="quick-nav-overlay"></div>
            <script src="{{asset("public/js/jquery.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/bootstrap.min.js")}}" type="text/javascript"></script>
            <script src="{{asset("public/js/jquery.slimscroll.min.js")}}" type="text/javascript"></script>
    <script type="text/javascript">
        var _token = "{{ csrf_token() }}";
    </script>
            <script src="{{asset("public/js/app.min.js")}}" type="text/javascript"></script>
    <script src="{{asset("public/js/category-add.js")}}" type="text/javascript"></script>
    
    项目文件夹/app/http/kernal.php

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
          //  \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    
        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];
    
    把这一行放在注释中


    \App\Http\Middleware\VerifyCsrfToken::class


    您可以这样设置
    X-CSRF-TOKEN
    。有关更多详细信息,请参阅官方网站

    <meta name="csrf-token" content="{{ csrf_token() }}">
    
         $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });
    
    
    $.ajaxSetup({
    标题:{
    'X-CSRF-TOKEN':$('meta[name=“CSRF-TOKEN”]).attr('content'))
    }
    });
    
    在您的情况下,您没有在config/Session.php中将会话Cookie路径正确设置为子目录,因为您的项目不在域的根目录中

    所以如果你的应用程序URL是

    那么config/session.php中的路径应该如下

    'path' => '/ts/cart-products'
    


    你忘了添加“/ts”。

    尝试从你的Ajax request.category-add.js中删除标题,并确保app.js已经包含在category-add.js之前。正如你在ajaxSetUp中所提到的,它是全局的,无需再次提及。
    app.js
    已经包含在
    category add.js
    之前。我也尝试了rem从app.js
    和category add.js
    中逐个查看标题,但chrome中没有luckCheck网络选项卡。检查请求标题是否有
    \u token
    @aldrin27:是的,我尝试过从控制台显示和标记。你检查过问题中给出的所有代码了吗?我尝试过你的代码,但不幸的是没有工作,标记I因为你把csrf_token()函数放在js文件中,你必须在blade上创建一个名为token的新变量,并将其注入js文件将
    FormData
    无法从表单中获取值?不,在blade上你只需添加var _token=“{{csrf_token()}”,然后在js文件中把_token变量放在数据中。数据:{''u-token':'u-token',data':formData}这将对您有效,因为我已经提到了在
    category add.js
    文件中编写的ajax函数,因此我无法在那里编写您的代码。正如我告诉您的,在控制台上显示令牌值时,
    helpers
    category add.js
    中?对不起,不是“helpers”,我指的是“headers”您的意思是从ajax中删除头并复制
    ajaxSetup()
    并将其粘贴到ajax函数中?是否有其他解决方案?在给定代码中未发现任何问题?请解释为什么需要注释?\App\Http\Middleware\VerifyCsrfToken::class是中间件。在每个请求中检查csrf令牌。是否有其他解决方案?在给定代码中未发现任何问题?是否有其他解决方案?在给定的代码中没有发现任何问题?哦,您只需用您的令牌替换_令牌,我在表单中有
    \u令牌
    ,这是使用jquery
    Formdata
    获取的。