Я использую Laravel 5 с сообщением ajax в всплывающем предупреждении, и он дает мне ошибку «500 Internal Server Error», когда я проверил firebug, я обнаружил, что ajax возвращает страницу с ошибкой, говорящую «TokenMismatchException в VerifyCsrfToken.php строка 46: "
когда я комментирую App\Http\Middleware\VerifyCsrfToken
, он работает нормально, но я предполагаю, что это не рекомендуется, я печатаю переменную _token и не пуст
почтовый индекс ajax:
$('#demo_4').click(function(){ bootbox.prompt("What is your name?", function(result) { if (result === null) { alert("Prompt dismissed"); } else { // alert("Hi <b>"+result+"</b>"); $.ajax({ url: 'test', type: "post", data: {'name':result, '_token': $('input[name=_token]').val()}, success: function(data){ alert(data); } }); } }); });
Код маршрута:
Route::post('test', 'AccountController@login');
код AccountController:
<?php namespace App\Http\Controllers; use Input; use Request; use App\Http\Controllers; class AccountController extends Controller { public function login() { if (Request::ajax()) { $data = Input::all(); print_r($data); die; } } }
Вы должны вставить эту строку в свою форму
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
Или добавьте это в контроллер
use Illuminate\Support\Facades\Session
Включите отладчик и сообщите, что показывает отладчик Laravel5, чтобы говорить более подробно.
В вызове ajax добавьте это в параметр data
:
'_token':$('input[name=_token]').val()
Или глобально добавить
<meta name="_token" content="{!! csrf_token() !!}"/>
И добавьте в нижний колонтитул:
<script type="text/javascript"> $.ajaxSetup({ headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') } }); </script>
UPD: к контроллеру
use Input; use Request; class AccountController extends Controller { public function login() { // Getting all post data if(Request::ajax()) { $data = Input::all(); print_r($data);die; } }
UPD2: попробуйте добавить это в свой основной макет
<meta name="_token" content="{!! csrf_token() !!}"/> <script type="text/javascript"> $.ajaxSetup({ headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') } }); </script>
Убедитесь, что ваш веб-сервер уже имеет доступ к записи в каталог сеансов, это может быть app/storage/framework/sessions/
. казнить
rm -f {your_web_app}/storage/framework/sessions/*
Перезагрузите веб-сервер.
В некоторых случаях проверяйте app/Http/Middleware/VerifyCsrfToken.php
на метод tokensMatch
с помощью этого кода:
$token = $request->ajax() ? $request->header('X-CSRF-Token') : $request->input('_token'); return $request->session()->token() == $token;
И проверьте файл javascript для этого:
// CSRF protection $.ajaxSetup( { headers: { 'X-CSRF-Token': $('input[name="_token"]').val() } });
Я также столкнулся с аналогичной проблемой
Замените data: {'name':result, '_token': $('input[name=_token]').val()},
с data: {'name':result, '_token': "$('input[name=_token]').val()"},
Размещение двойных кавычек вокруг маркера решило мою проблему.