Laravel 5.5 ajax call 419 (onbekende status)

Ik doe een ajax-oproep, maar ik krijg steeds deze foutmelding:

419 (onbekende status)

Geen idee wat dit veroorzaakt. Ik zag in andere berichten dat het iets met csrf-token moet doen, maar ik heb geen formulier, dus ik weet niet hoe ik dit moet oplossen.

mijn oproep:

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

Mijn route:

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

Mijn controllermethode

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

Het uiteindelijke doel is om iets van het antwoord in een html-element weer te geven.


Antwoord 1, autoriteit 100%

Gebruik dit in het hoofdgedeelte:

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

en verkrijg het csrf-token in ajax:

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

Raadpleeg de Laravel-documentatie csrf_token


Antwoord 2, autoriteit 9%

Een andere manier om dit op te lossen is door het veld _tokenin ajax-gegevens te gebruiken en de waarde van {{csrf_token()}}in blade in te stellen. Hier is een werkende code die ik zojuist heb geprobeerd.

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

Antwoord 3, autoriteit 4%

Dit is vergelijkbaar met het antwoord van Kannan. Dit lost echter een probleem op waarbij de token niet naar sites met meerdere domeinen mag worden verzonden. Hiermee wordt de koptekst alleen ingesteld als het een lokaal verzoek is.

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

Antwoord 4, autoriteit 3%

Het is mogelijk dat uw sessiedomein niet overeenkomt met uw app-URL en/of de host die wordt gebruikt om toegang te krijgen tot de app.

1.) Controleer uw .env-bestand:

SESSION_DOMAIN=example.com
APP_URL=example.com

2.) Controleer config/session.php

Verifieer de waarden om er zeker van te zijn dat ze correct zijn.


Antwoord 5, autoriteit 2%

gebruik dit op je pagina

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

en in uw ajax gebruikte het in gegevens:

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

dat is:

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

Bedankt.


Antwoord 6, autoriteit 2%

Als u de bovenstaande suggesties al heeft gedaan en het probleem nog steeds heeft.

Zorg ervoor dat de env-variabele:

SESSION_SECURE_COOKIE

Is ingesteld op falsealsje geen SSL-certificaat hebt, zoals op lokaal.


Antwoord 7

in mijn geval vergat ik csrf_token invoer toe te voegen aan het ingediende formulier.
dus ik deed dit
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

Antwoord 8

Als je .js vanuit een bestand laadt, moet je een variabele instellen met de csrf_token in je “hoofd” .blade.php-bestand waar je de .js importeert en de variabele gebruiken in je ajax-aanroep.

index.blade.php

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

anderbestand.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
    }
});

Antwoord 9

Ook al heb je een csrf_token, als je je controlleracties verifieert met behulp van Laravel Policieskun je ook 419 reacties krijgen. In dat geval moet u de nodige beleidsfuncties toevoegen aan uw klasse Policy.


Antwoord 10

enkele referenties =>

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

Antwoord 11

Je moet de csrf-token ophalen..

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

Nadat hetzelfde probleem is ontstaan, voegt u gewoon deze metatag toe< meta name="csrf-token" content="{{ csrf_token() }}" >

Hierna treedt ook de fout op, u kunt de Ajax-fout controleren. Controleer dan ook de Ajax-fout

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

Antwoord 12

Dit werkte voor mij:

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

Hierna stel je een normale AJAX-oproep in. Voorbeeld:

   $.ajax({
       type:'POST',
       url:'custom_url',
       data:{name: "some name", password: "pass", email: "[email protected]"},
       success:function(response){
          // Log response
          console.log(response);
       }
    });

Antwoord 13

Ik had SESSION_SECURE_COOKIEingesteld op true, dus mijn ontwikkelomgeving werkte niet bij het inloggen, dus heb ik SESSION_SECURE_COOKIE=falsetoegevoegd
naar mijn dev .env-bestand en alles werkt prima. Mijn fout was het wijzigen van het session.php-bestand in plaats van de variabele toe te voegen aan het .env-bestand.


Antwoord 14

maak gewoon de formuliergegevens een serienummer en je probleem wordt opgelost.

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

Antwoord 15

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

Antwoord 16

2019 Laravel-update, nooit gedacht dat ik dit zou posten, maar voor die ontwikkelaars zoals ik die de browser fetch-api gebruiken op Laravel 5.8 en hoger. Je moet je token doorgeven via de headers-parameter.

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

Antwoord 17

Deze fout treedt ook op als u bent vergeten dit op te nemen in uw ajax-indieningsverzoek ( POST ),
inhoudstype: onwaar,
processData: false,


Antwoord 18

Ik kreeg deze foutmelding, hoewel ik al een csrf-token had verzonden. Bleek dat er geen ruimte meer was op de server.

Other episodes