Laravel 5.2 TokenMismatchException с AJAX - PullRequest
0 голосов
/ 22 февраля 2019

Я использую Laravel 5.2 и иногда получаю исключение TokenMismatchException.

Форма, на которой происходит несоответствие токена, отправляется с ajax.Когда пользователь открывает страницу с формой, я устанавливаю метатег с токеном csrf следующим образом:

        <meta name="_token" content="{{ csrf_token() }}" />

На кнопке отправки я запускаю свой запрос ajax следующим образом:

          var fd = new FormData();
          var csrf_token = $('meta[name="_token"]').attr('content');
          fd.append('_token', csrf_token);
          // all normal inputs
          $.each($normal_inputs, function(key, value) {
            fd.append(value.name, value.value);
          });
          // all radio inputs
          $.each($radio_inputs, function(key, value) {
            fd.append(value.name, value.value);
          });
          // all checkbox inputs
          $.each($checkbox_inputs, function(key, value) {
            if (value.checked == true) {
              fd.append(value.name, 1);
            }
          });
          // all inline inputs
          $.each($inline_inputs, function(key, value) {
            fd.append(value.name, value.value);
          });

          $.ajax({
              url         : formUrl,
              data        : fd,
              processData : false,
              contentType : false,
              type        : 'POST',
              async       : false,
              success:function(data) {
                // success
              },
              error:function() {
                // error
              }
          });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Мой файл конфигурации сеанса выглядит следующим образом:

/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option controls the default session "driver" that will be used on
| requests. By default, we will use the lightweight native driver but
| you may specify any of the other wonderful drivers provided here.
|
| Supported: "file", "cookie", "database", "apc",
|            "memcached", "redis", "array"
|
*/

'driver' => env('SESSION_DRIVER', 'file'),

/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/

'lifetime' => 720,

'expire_on_close' => false,

/*
|--------------------------------------------------------------------------
| Session Encryption
|--------------------------------------------------------------------------
|
| This option allows you to easily specify that all of your session data
| should be encrypted before it is stored. All encryption will be run
| automatically by Laravel and you can use the Session like normal.
|
*/

'encrypt' => false,

/*
|--------------------------------------------------------------------------
| Session File Location
|--------------------------------------------------------------------------
|
| When using the native session driver, we need a location where session
| files may be stored. A default has been set for you but a different
| location may be specified. This is only needed for file sessions.
|
*/

'files' => storage_path('framework/sessions'),

/*
|--------------------------------------------------------------------------
| Session Database Connection
|--------------------------------------------------------------------------
|
| When using the "database" or "redis" session drivers, you may specify a
| connection that should be used to manage these sessions. This should
| correspond to a connection in your database configuration options.
|
*/

'connection' => null,

/*
|--------------------------------------------------------------------------
| Session Database Table
|--------------------------------------------------------------------------
|
| When using the "database" session driver, you may specify the table we
| should use to manage the sessions. Of course, a sensible default is
| provided for you; however, you are free to change this as needed.
|
*/

'table' => 'sessions',

/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
|--------------------------------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/

'lottery' => [2, 100],

/*
|--------------------------------------------------------------------------
| Session Cookie Name
|--------------------------------------------------------------------------
|
| Here you may change the name of the cookie used to identify a session
| instance by ID. The name specified here will get used every time a
| new session cookie is created by the framework for every driver.
|
*/

/**
 * We changed the name of this session from laravel_session
 * The reason being is there are many browser extensions to check to see what
 * software your website is built with, most check for the Set-Cookie header to be 'laravel_session'
 * We want to hide these programs from knowing in case people are trying to exploit security holes in your
 * site based on the frameworks it's built on.
 */

'cookie' => 'cookiename',

/*
|--------------------------------------------------------------------------
| Session Cookie Path
|--------------------------------------------------------------------------
|
| The session cookie path determines the path for which the cookie will
| be regarded as available. Typically, this will be the root path of
| your application but you are free to change this when necessary.
|
*/

'path' => '/',

/*
|--------------------------------------------------------------------------
| Session Cookie Domain
|--------------------------------------------------------------------------
|
| Here you may change the domain of the cookie used to identify a session
| in your application. This will determine which domains the cookie is
| available to in your application. A sensible default has been set.
|
*/

'domain' => 'domainname.com',

/*
|--------------------------------------------------------------------------
| HTTPS Only Cookies
|--------------------------------------------------------------------------
|
| By setting this option to true, session cookies will only be sent back
| to the server if the browser has a HTTPS connection. This will keep
| the cookie from being sent to you if it can not be done securely.
|
*/

'secure' => true,

/*
|--------------------------------------------------------------------------
| HTTP Access Only
|--------------------------------------------------------------------------
|
| Setting this value to true will prevent JavaScript from accessing the
| value of the cookie and the cookie will only be accessible through
| the HTTP protocol. You are free to modify this option if needed.
|
*/

'http_only' => false,

Я не понимаю, почему возникает исключение TokenMismatchException, поскольку оно работает в других частяхвеб-сайт.

...