Laravel 5.5 ajax call 419 (status tidak diketahui)

145

Saya melakukan panggilan ajax tapi saya terus mendapatkan kesalahan ini:

419 (status tidak diketahui)

Tidak tahu apa yang menyebabkan ini saya lihat di posting lain itu harus melakukan sesuatu dengan csrf token tapi saya tidak punya bentuk jadi saya tidak tahu bagaimana cara memperbaikinya.

panggilanku:

$('.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);
          }
     });
  });

Rute saya:

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

Metode pengontrol saya

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

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

Tujuan utamanya adalah untuk menampilkan sesuatu dari respons dalam elemen html.

Chris
sumber
4
apakah kamu memiliki ini <meta name="csrf-token" content="{{ csrf_token() }}">
Hanlin Wang
@HanlinWang Tidak, saya tidak memiliki formulir itu hanya dropdown.
Chris
sudahkah Anda menambahkan {{csrf_field()}}di formulir Anda ??
Tn. Pyramid
3
dropdown adalah bagian dari formulir yang Anda perlukan untuk membuat permintaan itu melalui formulir
Tn. Pyramid
1
atau berikan csrf_token dalam data Anda seperti ini{'_token': {{csrf_token()}}}
Tn. Pyramid

Jawaban:

301

Gunakan ini di bagian kepala:

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

dan dapatkan token csrf di ajax:

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

Silakan merujuk Dokumentasi Laravel csrf_token

Kannan K
sumber
1
Terima kasih, itu berhasil untuk saya. Saya mencoba menggunakan metode 'HAPUS' untuk panggilan ajax dan ini bekerja seperti pesona.
Salvo
4
Saya sudah menyiapkan kode persis ini, tetapi saya masih mengalami masalah OP dalam situasi berikut: pengguna masuk, tetapi situs tetap menganggur untuk waktu yang lama (misalnya, komputer tidur dengan browser terbuka). Dalam hal ini, ketika pengguna kembali ke komputer dan mencoba panggilan AJAX, kesalahan ini terjadi. Setelah dimuat ulang, semuanya kembali normal. Adakah yang punya solusi untuk ini?
jovan
@jovan Ada dua cara yang bisa Anda lakukan dengan mudah. Lihatlah perpustakaan jquery mengagumkan ini https://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idle . Kedua, Atas permintaan ajax Anda, periksa apakah ia mengembalikan kode kesalahan 419 lalu redirect.
riliwanrabo
@jovan Saya juga berjuang dengan ini dan bahkan menutup browser, dll tidak akan memperbaiki masalah ini. Saya berhasil menemukan cara untuk memperbaikinya dan dengan meletakkan baris kode 'ajaxsetup ()' yang disebutkan di atas DALAM panggilan saya () panggilan - token csrf diatur dengan benar dan semuanya mulai bekerja dengan sempurna.
SupaMonkey
2
Tapi mengapa 419 Unknown status? Mengapa tidak 419 Invalid CSRF tokenatau ada tanggapan yang bermanfaat dan ada? Dari mana asalnya? Mengapa? Dll
Rudie
26

Cara lain untuk mengatasi ini adalah dengan menggunakan _tokenbidang dalam data ajax dan mengatur nilai {{csrf_token()}}in blade. Berikut adalah kode yang saya coba pada akhirnya.

$.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);

    },
});
Waqas Bukhary
sumber
header: {'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). attr ('content')},
Kamlesh
12

Ini mirip dengan jawaban Kannan. Namun, ini memperbaiki masalah di mana token tidak boleh dikirim ke situs lintas domain. Ini hanya akan mengatur tajuk jika itu adalah permintaan lokal.

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'));
        }
    },
});
Damien Ó Ceallaigh
sumber
Pengaturan header normal berfungsi untuk saya untuk sementara waktu, tetapi secara acak mulai mengalami masalah setelah berbulan-bulan bekerja dengan baik. Saya tidak sepenuhnya yakin mengapa itu mulai memiliki masalah entah dari mana, tetapi solusi ini berhasil dan memperbaiki masalah bagi saya.
Frank A.
7

gunakan ini di halaman Anda

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

dan di ajax Anda menggunakannya dalam data:

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

itu adalah:

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

Terima kasih.

Y. Joy Ch. Singha
sumber
7

Mungkin domain sesi Anda tidak cocok dengan URL aplikasi Anda dan / atau host yang digunakan untuk mengakses aplikasi.

1.) Periksa file .env Anda:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) Periksa config / session.php

Verifikasi nilai untuk memastikan semuanya benar.

Jeff Callahan
sumber
1
Ini solusi yang tepat untuk saya. Sangat frustasi, kode HTTP 419 tidak cocok dengan spesifikasi HTTP dan dapat berarti banyak hal.
Cobolt
5

Jika Anda sudah melakukan saran di atas dan masih memiliki masalah.

Pastikan variabel env:

SESSION_SECURE_COOKIE

Diatur ke false jika Anda tidak memiliki sertifikat SSL, seperti di lokal.

2Febeb
sumber
4

dalam kasus saya, saya lupa menambahkan input csrf_token ke formulir yang dikirimkan. jadi saya melakukan HTML ini:

<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
Orang Mati
sumber
1
ini <input type="hidden" id="_token" value="{{ csrf_token() }}"> perlu bahkan jika kita melakukan submit whitouth ajax, kalau tidak saya punya kesalahan 419 aneh
Sr.PEDRO
3

Meskipun Anda memiliki csrf_token, jika Anda mengautentikasi tindakan pengontrol menggunakan Laravel, PoliciesAnda dapat memiliki 419 respons juga. Dalam hal ini Anda harus menambahkan fungsi kebijakan yang diperlukan di Policykelas Anda .

Tharanga
sumber
3

Jika Anda memuat .js dari file, Anda harus menetapkan variabel dengan csrf_token di file .blade.php "utama" tempat Anda mengimpor .js dan menggunakan variabel dalam panggilan ajax Anda.

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
sumber
1

beberapa referensi =>

...
<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>
...
MENGAPA
sumber
1

serialkan data formulir dan selesaikan masalah Anda.

data: $('#form_id').serialize(),
Muhammad Umair
sumber
1

Anda harus mendapatkan token csrf ..

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

Setelah melakukan masalah yang sama muncul, Cukup Tambahkan tag meta ini< meta name="csrf-token" content="{{ csrf_token() }}" >

Setelah ini juga kesalahan muncul, Anda dapat memeriksa kesalahan Ajax. Kemudian Juga periksa kesalahan 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);
    },
});
Balaji Rajendran
sumber
1
formData = new FormData();
formData.append('_token', "{{csrf_token()}}");
formData.append('file', blobInfo.blob(), blobInfo.filename());
xhr.send(formData);
belajarkevin
sumber
Terima kasih atas cuplikan kode ini, yang mungkin memberikan bantuan terbatas dan segera. Sebuah penjelasan yang tepat akan sangat meningkatkan nilai jangka panjang dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini dan akan membuatnya lebih bermanfaat untuk pembaca masa depan dengan lainnya, pertanyaan-pertanyaan serupa. Harap edit jawaban Anda untuk menambahkan beberapa penjelasan, termasuk asumsi yang Anda buat.
Kinerja Tertentu
1

2019 Pembaruan Laravel, Tidak pernah terpikir saya akan memposting ini tetapi untuk para pengembang seperti saya menggunakan browser mengambil api di Laravel 5.8 dan di atas. Anda harus meneruskan token Anda melalui parameter header.

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
sumber
1

Saya telah SESSION_SECURE_COOKIEmenetapkan true sehingga lingkungan dev saya tidak berfungsi saat masuk, jadi saya menambahkan SESSION_SECURE_COOKIE=false ke file dev .env saya dan semua berfungsi dengan baik kesalahan saya adalah mengubah file session.php alih-alih menambahkan variabel ke file .env.

Dunks1980
sumber
0

Kesalahan ini juga terjadi jika Anda lupa untuk memasukkan ini, dalam permintaan pengiriman ajax Anda (POST), contentType: false, processData: false,

Shamseer Ahammed
sumber
0

Mendapat kesalahan ini meskipun saya sudah mengirim token csrf. Ternyata tidak ada lagi ruang tersisa di server.

NicholasTes
sumber
0

Ini berfungsi baik untuk kasus-kasus yang Anda tidak memerlukan formulir.

gunakan ini di header:

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

dan ini dalam kode JavaScript Anda:

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

Cara sederhana untuk memperbaiki 419 status yang tidak diketahui pada konsol Anda adalah dengan meletakkan skrip ini di dalam FORMULIR Anda. {{csrf_field ()}}

Denz A Gatcho
sumber
0

Ini bekerja untuk saya:

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

Setelah ini atur panggilan AJAX biasa. Contoh:

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

       data:{name: "some name", password: "pass", email: "[email protected]"},

       success:function(response){

          // Log response
          console.log(response);

       }

    });
Nole
sumber