Laravel 5.5 ajax call 419 (bilinmeyen durum)


145

Ajax çağrısı yapıyorum ama bu hatayı almaya devam ediyorum:

419 (bilinmeyen durum)

Buna neden olduğu hakkında hiçbir fikrim yok, diğer yazılarda csrf jetonu ile bir şeyler yapmak zorunda kaldım ama formum yok, bu yüzden bunu nasıl düzelteceğimi bilmiyorum.

benim aramam:

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

Rotam:

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

Denetleyici yöntemim

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

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

Nihai hedef, bir html öğesindeki yanıttan bir şey görüntülemektir.


4
bunu aldın mı <meta name="csrf-token" content="{{ csrf_token() }}">
Hanlin Wang

@HanlinWang Hayır Sadece bir açılır liste olan bir formum yok.
Chris

Eklediğiniz {{csrf_field()}}formunuzda ??
Bay Piramit

3
açılan form, bu isteği form aracılığıyla yapmanız gereken formun bir parçasıdır
Bay Pyramid

1
veya verilerinizdeki csrf_token'i bu şekilde iletin{'_token': {{csrf_token()}}}
Bay Piramit

Yanıtlar:


303

Bunu baş bölümünde kullanın:

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

ve ajax'ta csrf jetonunu alın:

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

Lütfen Laravel Belgelerine bakın csrf_token


1
Teşekkürler, benim için çalıştı. Ajax çağrı için 'DELETE' yöntemini kullanmaya çalışıyordu ve bu bir cazibe gibi çalıştı.
Salvo

4
Bu tam kodu ayarladım, ancak hala aşağıdaki durumda OP sorunu yaşıyorum: kullanıcı oturum açmış, ancak site uzun bir süre boşta kalır (örneğin, bilgisayar tarayıcı açıkken uyku moduna geçer). Bu durumda, kullanıcı bilgisayara geri döndüğünde ve bir AJAX çağrısını denediğinde, bu hata oluşur. Yeniden yüklemeden sonra her şey normale döner. Bunun bir çözümü olan var mı?
jovan

@ jovan Bunu kolayca gerçekleştirmenin iki yolu vardır. Bu harika jquery kütüphanelerine bir göz atın https://www.jqueryscript.net/other/Session-Timeout-Alert-Plugin-With-jQuery-userTimeout.html https://github.com/kidh0/jquery.idle . İkincisi, ajax isteğinizde 419 hata kodunu döndürüp döndürmediğini kontrol edin ve yönlendirin.
riliwanrabo

@ jovan Ben de bu ile mücadele ve hatta tarayıcı, vb kapatılması sorunu gidermek olmaz. Ben nasıl olsa düzeltmek için bulmak başardı ve benim yazı () çağrısı WITHIN yukarıda belirtilen 'ajaxsetup ()' kod satırı koyarak başardı - csrf jetonu düzgün ayarlandı ve her şey kusursuz çalışmaya başladı.
SupaMonkey

2
Ama neden 419 Unknown status? Neden olmasın 419 Invalid CSRF tokenya da mevcut, faydalı bir cevap? Nereden geliyor? Neden? Vb
Rudie

26

Bunu çözmenin başka bir yolu _tokenda ajax verilerindeki alanı kullanmak ve blade'deki değerini ayarlamaktır {{csrf_token()}}. İşte sonunda çalıştığım bir çalışma kodu.

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

    },
});

başlıklar: {'X-CSRF-TOKEN': $ ('meta [name = "csrf-token"]'). attr ('content')},
Kamlesh

12

Bu Kannan'ın cevabına benzer. Ancak bu, tokenın etki alanları arası sitelere gönderilmemesi gereken bir sorunu giderir. Bu, üstbilgiyi yalnızca yerel bir istekse ayarlar.

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

Normal başlık kurulumu benim için bir süre çalıştı, ancak aylarca çalıştıktan sonra rastgele sorun yaşamaya başladı. Neden hiçbir yerde sorun yaşamaya başladığından tam olarak emin değilim, ancak bu çözüm harika çalıştı ve sorunu benim için düzeltti.
Frank A.

7

bunu sayfanızda kullanın

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

ve ajax'ınızda bunu verilerde kullandı:

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

yani:

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

Teşekkürler.


7

Oturum alan adınızın uygulama URL'nizle ve / veya uygulamaya erişmek için kullanılan ana bilgisayarla eşleşmemesi mümkündür.

1.) .env dosyanızı kontrol edin:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) config / session.php dosyasını kontrol edin

Doğru olduklarından emin olmak için değerleri doğrulayın.


1
Bu benim için doğru çözümdü. Çok sinir bozucu, HTTP 419 kodu HTTP spesifikasyonu ile eşleşmiyor ve çok fazla şey ifade edebilir.
Cobolt

5

Yukarıdaki önerileri zaten yaptıysanız ve hala sorunu yaşıyorsanız.

Env değişkeninin şunlardan emin olun:

SESSION_SECURE_COOKIE

Olarak ayarlanırsa false eğer yerel olduğu gibi, bir SSL sertifikası yok.


4

benim durumumda gönderilen forma csrf_token girişi eklemeyi unuttum. bu HTML yaptım:

<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() }}">biz bir whitouth ajax bir gönderme yapmak bile bu gerekli, aksi takdirde garip 419 hatası var
Sr.PEDRO

3

csrf_tokenA'nız olmasına rağmen , Laravel kullanarak denetleyici eylemlerinizi doğrularsanız Policies419 yanıtı da alabilirsiniz. Bu durumda, Policysınıfınıza gerekli ilke işlevlerini eklemelisiniz .


3

Bir dosyadan .js yüklüyorsanız, .js dosyasını içe aktardığınız ve ajax çağrınızda değişkeni kullandığınız "main" .blade.php dosyanızda csrf_token ile bir değişken ayarlamanız gerekir.

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

bazı referanslar =>

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

sadece form verilerini serileştirin ve sorununuzu çözün.

data: $('#form_id').serialize(),

1

Csrf jetonunu almalısın ..

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

Aynı sorunu yaptıktan sonra artış var, sadece bu meta etiketi ekle< meta name="csrf-token" content="{{ csrf_token() }}" >

Bundan sonra hata da ortaya çıkar, Ajax hatasını kontrol edebilirsiniz. Ardından Ajax hatasını da kontrol edin

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

Sınırlı ve anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Bir Doğru bir açıklama ölçüde bu soruna iyi bir çözüm olmasının nedeni göstererek uzun vadeli değerini artıracak ve diğer benzer sorularla gelecek okuyucularına daha kullanışlı bir hale getirecektir. Yaptığınız varsayımlar dahil bazı açıklamalar eklemek için lütfen yanıtınızı düzenleyin .
CertainPerformance

1

2019 Laravel Güncellemesi, Bunu yayınlayacağımı hiç düşünmemiştim ama benim gibi geliştiriciler için Laravel 5.8 ve üzeri tarayıcılarda API getir. Simgenizi headers parametresi üzerinden geçirmeniz gerekir.

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

Ben vardı SESSION_SECURE_COOKIEbenim dev ortamı eser yoktu çok doğru ayarlandığında günlük ekledim böylece, içinde SESSION_SECURE_COOKIE=false benim dev .env dosyaya ve tüm eserler benim hatam session.php dosyasını değiştirerek yerine .env dosyasına değişken ekliyordu ince.



0

Zaten csrf jetonu göndermiş olmama rağmen bu hatayı aldım. Sunucuda artık yer kalmadı.


0

Bu, bir forma ihtiyaç duymadığınız durumlar için harika çalışır.

bunu başlıkta kullan:

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

JavaScript kodunuzda:

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

0

Konsolunuzda bilinmeyen bir 419 durumunu düzeltmenin basit bir yolu, bu komut dosyasını FORM'nuza yerleştirmektir. {{csrf_field ()}}


0

Bu benim için çalıştı:

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

Bundan sonra düzenli AJAX çağrısı ayarlayın. Misal:

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

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

       success:function(response){

          // Log response
          console.log(response);

       }

    });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.