Laravel 5.5 ajax call 419 (невідомий статус)


145

Я телефоную в Ajax, але я продовжую отримувати цю помилку:

419 (невідомий статус)

Не маю уявлення, що викликає це, я бачив на інших публікаціях, він повинен щось робити з маркером csrf, але у мене немає форми, тому я не знаю, як це виправити.

мій дзвінок:

$('.company-selector li > a').click(function(e) {
     e.preventDefault();

     var companyId = $(this).data("company-id");


      $.ajax({
          headers: {
          'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          },
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {},
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });
  });

Мій маршрут:

Route::post('fetch-company/{companyId}', 'HomeController@fetchCompany');

Мій метод контролера

/**
 * Fetches a company
 *
 * @param $companyId
 *
 * @return array
 */
public function fetchCompany($companyId)
{
    $company = Company::where('id', $companyId)->first();

    return response()->json($company);
}

Кінцева мета - відобразити щось із відповіді в html-елементі.


4
у вас це було? <meta name="csrf-token" content="{{ csrf_token() }}">
Hanlin Wang

@HanlinWang Ні, у мене немає форми, це просто спадання.
Кріс

ви додали {{csrf_field()}}у свою форму ??
Містер Піраміда

3
спадне меню - це частина форми, яку потрібно зробити для цього запиту через форму
Містер Піраміда

1
або передайте csrf_token у своїх даних так{'_token': {{csrf_token()}}}
Містер Піраміда

Відповіді:


301

Використовуйте це в розділі голови:

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

і отримай маркер csrf в ajax:

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

Будь ласка, зверніться до документації Laravel csrf_token


1
Дякую, це працювало на мене. Я намагався використовувати метод 'DELETE' для виклику ajax, і це спрацювало як шарм.
Сальво

4
У мене встановлений такий точний код, але я все ще відчуваю проблему ОП у такій ситуації: користувач увійшов у систему, але сайт залишається в режимі очікування протягом тривалого періоду (наприклад, комп'ютер перебуває у режимі сну з відкритим браузером). У цьому випадку, коли користувач повертається до комп’ютера і спробує дзвінок AJAX, ця помилка трапляється. Після перезавантаження все повертається до норми. У когось є рішення на це?
Іван

@jovan Є два способи досягти цього легко. Погляньте на ці дивовижні бібліотеки jquery https://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idle . По-друге, на ваш запит ajax перевірте, чи повертає він код помилки 419, а потім переспрямуйте.
riliwanrabo

@jovan Я теж боровся з цим і навіть закривав браузер, і т. д. не вирішив би проблему. Мені вдалося знайти, як це виправити, і, поставивши вищезгаданий рядок коду 'ajaxsetup ()', згаданий вище, у моєму поштовому () виклику - маркер csrf був встановлений належним чином, і все почало працювати бездоганно.
SupaMonkey

2
Але чому 419 Unknown status? Чому ні 419 Invalid CSRF tokenчи якась існуюча, корисна відповідь? Звідки воно походить? Чому? Etc
Rudie

26

Інший спосіб вирішити це - використовувати _tokenполе в даних ajax і встановити значення {{csrf_token()}}в лезо. Ось робочий код, який я тільки що спробував у своєму кінці.

$.ajax({
    type: "POST",
    url: '/your_url',
    data: { somefield: "Some field value", _token: '{{csrf_token()}}' },
    success: function (data) {
       console.log(data);
    },
    error: function (data, textStatus, errorThrown) {
        console.log(data);

    },
});

заголовки: {'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). attr ('content')},
Kamlesh

12

Це схоже на відповідь Каннана. Однак це виправляє проблему, коли маркер не повинен надсилатися на сайти між доменами. Це встановить заголовок, лише якщо це місцевий запит.

HTML:

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

JS:

$.ajaxSetup({
    beforeSend: function(xhr, type) {
        if (!type.crossDomain) {
            xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
        }
    },
});

Нормальна настройка заголовка працювала для мене деякий час, але випадково почала виникати проблеми після місяців роботи. Я не зовсім впевнений, чому у нього почалися проблеми з нізвідки, але це рішення спрацювало чудово і вирішило проблему для мене.
Френк А.

7

використовуйте це на своїй сторінці

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

і у вашому ajax використали його в даних:

_token: '{!! csrf_token() !!}',

це є:

$.ajax({
          url: '/fetch-company/' + companyId,
          dataType : 'json',
          type: 'POST',
          data: {
                   _token: '{!! csrf_token() !!}',
                 },
          contentType: false,
          processData: false,
          success:function(response) {
               console.log(response);
          }
     });

Дякую.


7

Можливо, ваш домен сеансу не відповідає URL вашої програми та / або хосту, який використовується для доступу до програми.

1.) Перевірте .env файл:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) Перевірте config / session.php

Перевірте значення, щоб переконатися, що вони правильні.


1
Це було правильним рішенням для мене. Дуже засмучує, що код HTTP 419 не відповідає специфікації HTTP і може означати дуже багато речей.
Кобольт

5

Якщо ви вже зробили вищезазначені пропозиції, і все ще виникає проблема.

Переконайтеся, що змінна env:

SESSION_SECURE_COOKIE

Встановлюється, false якщо у вас немає сертифіката SSL, як, наприклад, у локальному.


4

у моєму випадку я забув додати csrf_token вхід до поданої форми. тому я зробив цей HTML:

<form class="form-material" id="myform">
...
<input type="file" name="l_img" id="l_img">
<input type="hidden" id="_token" value="{{ csrf_token() }}">
..
</form>

JS:

//setting containers
        var _token = $('input#_token').val();
        var l_img = $('input#l_img').val();
        var formData = new FormData();
        formData.append("_token", _token);
        formData.append("l_img", $('#l_img')[0].files[0]);

        if(!l_img) {
            //do error if no image uploaded
            return false;
        }
        else
        {
            $.ajax({
                type: "POST",
                url: "/my_url",
                contentType: false,
                processData: false,
                dataType: "json",
                data : formData,
                beforeSend: function()
                {
                    //do before send
                },
                success: function(data)
                {
                    //do success
                },
                error: function(jqXhr, textStatus, errorThrown) //jqXHR, textStatus, errorThrown
                {
                    if( jqXhr.status === "422" ) {
                        //do error
                    } else {
                        //do error
                    }
                }
            });
        }
        return false; //not to post the form physically

1
це <input type="hidden" id="_token" value="{{ csrf_token() }}">не потрібно, навіть якщо ми будемо надсилати аякс, інакше я отримав дивну помилку 419
Sr.PEDRO

3

Хоча у вас є csrf_token, якщо ви автентифікуєте дії контролера за допомогою Laravel, Policiesви також можете отримати відповідь 419. У цьому випадку слід додати необхідні функції політики у своєму Policyкласі.


3

Якщо ви завантажуєте файл .js з файлу, вам слід встановити змінну разом із файлом csrf_token у вашому "головному" .blade.php файлі, куди ви імпортуєте .js, і використовувати змінну у своєму виклику ajax.

index.blade.php

...
...
<script src="{{ asset('js/anotherfile.js') }}"></script>
<script type="text/javascript">
        var token = '{{ csrf_token() }}';
</script>

Anotherfile.js

$.ajax({
    url: 'yourUrl',
    type: 'POST',
    data: {
        '_token': token
    },
    dataType: "json",
    beforeSend:function(){
        //do stuff
    },
    success: function(data) {
        //do stuff
    },
    error: function(data) {
        //do stuff
    },
    complete: function(){
        //do stuff
    }
});

1

деякі реф =>

...
<head>
    // CSRF for all ajax call
    <meta name="csrf-token" content="{{ csrf_token() }}" />
</head>
 ...
 ...
<script>
    // CSRF for all ajax call
    $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': jQuery('meta[name="csrf-token"]').attr('content') } });
</script>
...


1

Ви повинні отримати маркер csrf ..

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

Після того, як ця проблема піднімається, просто додайте цей метатег< meta name="csrf-token" content="{{ csrf_token() }}" >

Після цього також виникає помилка, ви можете перевірити помилку Ajax. Потім також перевірте помилку Ajax

$.ajax({
    url: 'some_unknown_page.html',
    success: function (response) {
        $('#post').html(response.responseText);
    },
    error: function (jqXHR, exception) {
        var msg = '';
        if (jqXHR.status === 0) {
            msg = 'Not connect.\n Verify Network.';
        } else if (jqXHR.status == 404) {
            msg = 'Requested page not found. [404]';
        } else if (jqXHR.status == 500) {
            msg = 'Internal Server Error [500].';
        } else if (exception === 'parsererror') {
            msg = 'Requested JSON parse failed.';
        } else if (exception === 'timeout') {
            msg = 'Time out error.';
        } else if (exception === 'abort') {
            msg = 'Ajax request aborted.';
        } else {
            msg = 'Uncaught Error.\n' + jqXHR.responseText;
        }
        $('#post').html(msg);
    },
});

1
formData = new FormData();
formData.append('_token', "{{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);

Дякуємо за цей фрагмент коду, який може надати деяку обмежену та негайну допомогу. Належне пояснення буде значно поліпшити свою довгострокову цінність, показуючи , чому це є хорошим рішенням проблеми і зробить його більш корисним для читачів майбутніх з іншими подібними питаннями. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи зроблені вами припущення.
Окреме виконання

1

Оновлення Laravel 2019, ніколи не думав, що я опублікую це, але для тих розробників, як я, використовуючи api для перегляду веб-переглядача на Laravel 5.8 і вище. Ви повинні передати маркер через параметр заголовки.

var _token = "{{ csrf_token }}";
fetch("{{url('add/new/comment')}}", {
                method: 'POST',
                headers: {
                    'X-CSRF-TOKEN': _token,
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify(name, email, message, article_id)
            }).then(r => {
                return r.json();
            }).then(results => {}).catch(err => console.log(err));

1

Я SESSION_SECURE_COOKIEвстановив значення true, тому моє середовище розробників не працювало при вході в систему, тому я додав SESSION_SECURE_COOKIE=false у свій файл .vv dev, і все добре працює, моя помилка була зміною файлу session.php замість додавання змінної у файл .env.


0

Ця помилка також трапляється, якщо ви забули включити це у своєму запиті на надсилання Ajax (POST), contentType: false, processData: false,


0

Я отримав цю помилку, навіть якщо я вже надсилав маркер csrf. Виявилося, на сервері не залишилось більше місця.


0

Це чудово підходить для тих випадків, коли вам не потрібна форма.

використовувати це в заголовку:

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

і це у вашому коді JavaScript:

$.ajaxSetup({
        headers: {
        'X-CSRF-TOKEN': '<?php echo csrf_token() ?>'
        }
    });

0

Простий спосіб закріпити невідомий статус на консолі 419 - це помістити цей скрипт всередину вашої ФОРМИ. {{csrf_field ()}}


0

Це працювало для мене:

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': "{{ csrf_token() }}"
  }
});

Після цього встановити регулярний дзвінок AJAX. Приклад:

    $.ajax({
       type:'POST',
       url:'custom_url',

       data:{name: "some name", password: "pass", email: "test@test.com"},

       success:function(response){

          // Log response
          console.log(response);

       }

    });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.