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() }}">
Ван
@HanlinWang Нет, у меня нет формы, это просто выпадающий список.
Крис
Вы добавили {{csrf_field()}}в форму?
Мистер Пирамида,
3
выпадающий список является частью формы, которую вам нужно сделать, чтобы сделать этот запрос через форму
Mr. Pyramid
1
или передайте csrf_token в ваших данных, как это{'_token': {{csrf_token()}}}
Mr. Pyramid

Ответы:

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, и это сработало как чудо.
Salvo
4
У меня установлен точный код, но я все еще испытываю проблему OP в следующей ситуации: пользователь вошел в систему, но сайт остается бездействующим в течение длительного периода (например, компьютер переходит в спящий режим с открытым браузером). В этом случае, когда пользователь возвращается к компьютеру и пытается 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 (), упомянутую выше, В МОЙ вызов post () - токен 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': $ ( 'мета- [имя = "CSRF-маркер"]') атр ( 'содержание').},
Камлеш
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);
          }
     });

Спасибо.

Y. Joy Ch. Сингха
источник
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, как на локальном.

2Fwebd
источник
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() }}">необходимо, даже если мы отправим whitouth ajax, иначе я
получу
3

Даже если у вас есть csrf_token, если вы аутентифицируете свои действия контроллера с помощью Laravel, у Policiesвас также может быть 419 ответ. В этом случае вы должны добавить необходимые функции политики в вашем Policyклассе.

Tharanga
источник
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
    }
});
Wolfernand
источник
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

просто сериализовать данные формы и решить вашу проблему.

data: $('#form_id').serialize(),
Мухаммед Умайр
источник
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);
learnkevin
источник
Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную, немедленную помощь. Надлежащее объяснение будет значительно улучшить свою долгосрочную ценность, показывая , почему это является хорошим решением проблемы и сделает его более полезным для читателей будущих с другими подобными вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.
CertainPerformance
1

2019 Обновление Laravel, Никогда не думал, что я опубликую это, но для тех разработчиков, как я, использующих API выборки браузера на Laravel 5.8 и выше. Вы должны передать свой токен через параметр headers.

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));
Delino
источник
1

Я SESSION_SECURE_COOKIEустановил значение true, чтобы моя среда разработки не работала при входе в систему, поэтому я добавил SESSION_SECURE_COOKIE=false в свой файл dev .env, и все работает нормально, моя ошибка заключалась в изменении файла session.php вместо добавления переменной в файл .env.

Dunks1980
источник
0

Эта ошибка также происходит, если вы забыли включить это в запрос на отправку ajax (POST), contentType: false, processData: false,

Шамсир Ахаммед
источник
0

Получил эту ошибку, хотя я уже отправлял токен csrf. Оказалось, что на сервере больше не осталось места.

NicholasTes
источник
0

Это прекрасно работает в тех случаях, когда вам не нужна форма.

используйте это в заголовке:

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

и это в вашем коде JavaScript:

$.ajaxSetup({
        headers: {
        'X-CSRF-TOKEN': '<?php echo csrf_token() ?>'
        }
    });
lomelisan
источник
0

Простой способ исправить неизвестный статус 419 на вашей консоли - поместить этот скрипт внутрь вашей формы. {{csrf_field ()}}

Denz A Gatcho
источник
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);

       }

    });
Нола
источник