Próbuję usunąć dane z bazy danych za pośrednictwem AJAX.
HTML:
@foreach($a as $lis)
//some code
<a href="#" class="delteadd" id="{{$lis['id']}}">Delete</a>
//click action perform on this link
@endforeach
Mój kod AJAX:
$('body').on('click', '.delteadd', function (e) {
e.preventDefault();
//alert('am i here');
if (confirm('Are you sure you want to Delete Ad ?')) {
var id = $(this).attr('id');
$.ajax({
method: "POST",
url: "{{url()}}/delteadd",
}).done(function( msg ) {
if(msg.error == 0){
//$('.sucess-status-update').html(msg.message);
alert(msg.message);
}else{
alert(msg.message);
//$('.error-favourite-message').html(msg.message);
}
});
} else {
return false;
}
});
To jest moje zapytanie o pobranie danych z bazy danych ...
$a = Test::with('hitsCount')->where('userid', $id)->get()->toArray();
Ale kiedy kliknę Usuń dane łącza, które nie zostały usunięte i pokażę niezgodność csrf_token ...
Odpowiedzi:
Musisz dodać dane w swoim żądaniu Ajax. Mam nadzieję, że tak będzie.
źródło
.js
pliku?Najlepszym sposobem rozwiązania tego problemu „X-CSRF-TOKEN” jest dodanie następującego kodu do głównego układu i kontynuowanie normalnego wykonywania wywołań Ajax:
W nagłówku
W skrypcie
źródło
.js
plikachMyślę, że lepiej umieścić token w formularzu i uzyskać ten token przez id
A JQUery:
w ten sposób Twój JS nie musi znajdować się w plikach blade.
źródło
Właśnie dodałem
headers:
w wywołaniu Ajax:z uwagi:
funkcja Ajax:
w kontrolerze:
w route.php
źródło
Jeśli używasz plików szablonów, możesz umieścić swój
meta
tag w nagłówkusection
(lub jakkolwiek go nazwiesz), który zawiera Twojemeta
tagi.Następnie musisz
headers
przypisać atrybut do swojegoajax
(w moim przykładzie używamdatatable
z przetwarzaniem po stronie serwera:Oto pełny
datatable
przykład Ajax:Po wykonaniu tej czynności powinieneś dostać się
200 status
na swojąajax
prośbę.źródło
Wiedz, że istnieje plik cookie X-XSRF-TOKEN, który jest ustawiony dla wygody. Framework taki jak Angular i inni ustawiają go domyślnie. Sprawdź to w dokumencie https://laravel.com/docs/5.7/csrf#csrf-x-xsrf-token Możesz go użyć.
Najlepszym sposobem jest użycie meta, jeśli pliki cookie są dezaktywowane.
Tutaj zalecany sposób meta (możesz umieścić pole w dowolny sposób, ale meta jest cicha):
Zwróć uwagę na użycie
decodeURIComponent()
, dekoduje z formatu uri, który jest używany do przechowywania pliku cookie. [w przeciwnym razie w laravel pojawi się wyjątek dotyczący nieprawidłowego ładunku].Tutaj sekcja dotycząca pliku cookie csrf w dokumencie do sprawdzenia: https://laravel.com/docs/5.7/csrf#csrf-x-csrf-token
Również tutaj, jak laravel (bootstrap.js) domyślnie ustawia go dla axios:
możesz iść sprawdzić
resources/js/bootstrap.js
.A tutaj przeczytaj funkcję cookie:
źródło
Dodaj an
id
dometa
elementu, który zawiera tokenA potem możesz go pobrać w swoim Javascript
EDYCJA: Łatwiejszy sposób bez zmiany
meta
linii.Lub
Dzięki @ martin-hartmann
źródło
jeśli używasz jQuery do wysyłania postów AJAX, dodaj ten kod do wszystkich widoków:
Laravel dodaje plik cookie XSRF do wszystkich żądań i automatycznie dołączamy go do wszystkich żądań AJAX tuż przed przesłaniem.
Możesz zastąpić funkcję getCookie, jeśli istnieje inna funkcja lub wtyczka jQuery, która robi to samo.
źródło
Dla Laravel 5.8, ustawienie metatagu csrf dla twojego układu i ustawienie nagłówka żądania dla csrf w ustawieniach ajax nie zadziała, jeśli używasz Ajax do przesłania formularza, który już zawiera
_token
pole wejściowe wygenerowane przez silnik szablonów Laravel Blade.Musisz dołączyć już wygenerowany token csrf z formularza do żądania AJAX, ponieważ serwer będzie go oczekiwał, a nie ten w tagu meta.
Na przykład tak wygląda
_token
pole wejściowe generowane przez Blade:Następnie prześlij swój formularz za pomocą Ajax w następujący sposób:
Token csrf w nagłówku meta jest przydatny tylko wtedy, gdy przesyłasz formularz bez
_token
pola wejściowego wygenerowanego przez Blade .źródło
kto kiedykolwiek ma problem z zaakceptowaną odpowiedzią @Deepak saini, spróbuj usunąć
dla połączenia AJAX.
posługiwać się
źródło
Właściwie miałem ten błąd i nie mogłem znaleźć rozwiązania. W rzeczywistości nie wykonałem żądania Ajax. Nie wiem, czy ten problem był spowodowany tym, że jest to subdomena na moim serwerze, czy co. Oto moje jQuery.
Więc tak naprawdę skonfigurowałem kotwicę, aby przejść do mojego API, zamiast wykonywać żądanie posta, co, jak sądzę, robi większość aplikacji.
źródło
W formularzu należy uwzględnić ukryte pole tokenu CSRF (fałszowanie żądań między lokacjami), aby oprogramowanie pośredniczące ochrony CSRF mogło zweryfikować żądanie.
Laravel automatycznie generuje "token" CSRF dla każdej aktywnej sesji użytkownika zarządzanej przez aplikację. Ten token służy do weryfikacji, czy uwierzytelniony użytkownik jest tym, który faktycznie wysyła żądania do aplikacji.
Więc wykonując żądania Ajax, musisz przekazać token csrf poprzez parametr data. Oto przykładowy kod.
źródło
Po prostu używam @csrf wewnątrz formularza i działa dobrze
źródło