Szukaj…
Wprowadzenie
Przeanalizowałem, że stosunek błędu TokenMismatch jest bardzo wysoki. Ten błąd występuje z powodu niektórych głupich błędów. Istnieje wiele powodów, dla których programiści popełniają błędy. Oto kilka przykładów, tj. Brak _token na nagłówkach, brak _token przekazał dane podczas korzystania z Ajax, problem z uprawnieniami na ścieżce przechowywania, nieprawidłowa ścieżka przechowywania sesji.
Ustaw token na nagłówku
Ustaw token na <head>
swojego default.blade.php
.
<meta name="csrf-token" content="{{csrf_token()}}">
Dodaj ajaxSetup
na górze skryptu, który będzie dostępny wszędzie. Spowoduje to ustawienie nagłówków dla każdego wywołania ajax
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
Włącz token
Dodaj poniższą funkcję do tagu <form>
. Ta funkcja wygeneruje ukryte pole o nazwie _token
i wypełni token wartości.
{{csrf_field()}}
Dodaj csrf_token ()
do ukrytego _token
w atrybucie value. To wygeneruje tylko zaszyfrowany ciąg.
<input type="hidden" name="_token" value="{{csrf_token()}}"/>
.
Sprawdź ścieżkę i uprawnienia do przechowywania sesji
Tutaj zakładam, że URL aplikacji projektu to APP_URL=http://project.dev/ts/toys-store
- Ustaw uprawnienia do zapisu w
storage_path('framework/sessions')
. - Sprawdź ścieżkę swojego projektu laravel
'path' => '/ts/toys-store',
katalog główny projektu laravel. - Zmień nazwę swojego pliku cookie
'cookie' => 'toys-store',
return [
'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => 120,
'expire_on_close' => false,
'encrypt' => false,
'files' => storage_path('framework/sessions'),
'connection' => null,
'table' => 'sessions',
'lottery' => [2, 100],
'cookie' => 'toys-store',
'path' => '/ts/toys-store',
'domain' => null,
'secure' => false,
'http_only' => true,
];
Użyj pola _token na Ajaxie
Istnieje wiele sposobów wysyłania _token
podczas połączenia AJAX
- Uzyskaj wszystkie wartości pola wejściowego w
<form>
używającvar formData = new FormData($("#cart-add")[0]);
- Użyj
$("form").serialize();
lub$("form").serializeArray();
- Dodaj
_token
ręcznie dodata
Ajax. using$('meta[name="csrf-token"]').attr('content')
lub$('input[name="_token"]').val()
. - Możemy ustawić jako nagłówek dla określonego wywołania Ajax, takiego jak poniższy kod.
$.ajax({
url: $("#category-add").attr("action"),
type: "POST",
data: formData,
processData: false,
contentType: false,
dataType: "json",
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});