Laravel中Ajax请求的TokenMismatch错误 [英] TokenMismatch Error on Ajax Requests in Laravel

查看:79
本文介绍了Laravel中Ajax请求的TokenMismatch错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我提交表单时,我在Ajax Submit上收到TokenMismatch错误,这给了我错误.在这里,我正在使用Laravel 5.2.我在ajax调用中传递X-CSRF-TOKEN的位置.在default.blade.php的meta上设置Token.我已经尝试过StackOverflow的所有可能解决方案.

I am getting TokenMismatch Error on Ajax Submit when I submit form it gives me error. Here I am using Laravel 5.2. Where I am passing X-CSRF-TOKEN on ajax call. Set Token on on meta on default.blade.php. I've tried all possible solutions from StackOverflow.

  1. 更改存储文件夹的权限.
  2. 尝试清除缓存.
  3. 尝试添加Route::group(['middleware' => ['web','auth']], function () {
  4. 在ajax函数的标头中添加token.
  5. 尝试在表单内添加token字段.
  1. Changing permission of storage folder.
  2. Tried clearing cache.
  3. Try adding Route::group(['middleware' => ['web','auth']], function () {
  4. Adding token to header of ajax function.
  5. Tried adding token field inside form.

任何人都可以从下面的代码中找到任何解决方案.

Can anyone find any solution from below code.

知道我要去哪里错了吗?任何帮助将不胜感激

Any idea where I'm going wrong? Any help will be appreciated

以下是我的类别HTML表单category.blade.php:

Below is my Category HTML Form 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>

在我的app.js下方.

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

下面是我的category-add.js,这是我的ajax代码.我没有包括全部功能.

Below is my category-add.js here is my ajax code. I've not included whole function.

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.php

Below is my category route file route.php

Route::group(['middleware' => ['web','auth']], function () {
    Route::post('/category-add', array("as" => "category-add","uses" => "CategoryController@store"));
});

下面是我的CategoryController.php

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);
    }
}

下面是我的.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

下面是我的config/session.php文件

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

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',
    ],
];

推荐答案

在您的情况下,您未将config/session.php中的会话Cookie路径正确设置为子子目录,因为您的项目不在域的根目录中

In your case, you haven't properly set the Session Cookie Path in config/session.php to sub subdirectory as you project is not in root of your domain.

因此,如果您的APP_URL为 http://project.dev/ts/cart-products

So if your APP_URL is http://project.dev/ts/cart-products

然后您在config/session.php中的路径应如下

then your path in config/session.php should be as follow

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

您忘记添加'/ts'.

you forgot to add '/ts'.

这篇关于Laravel中Ajax请求的TokenMismatch错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆