Intereting Posts
PHP-массив из файла cookie: отображается только после обновления страницы? Как я могу заставить функцию php cos вернуть правильное значение? Отправлять push-уведомление конкретному пользователю с помощью Parse PHP array_intersect или in_array, тогда MYSQL Я хочу добавить строковые данные до первого символа и после последнего символа Получить все элементы по имени класса с помощью DOMDocument API Google Analytics на веб-сайте Codeigniter Как создать PDO-параметризованный запрос с помощью инструкции LIKE? Может ли phpunit использовать несколько поставщиков данных? Отправка паролей через Интернет Проверьте размеры изображения (высота и ширина) перед загрузкой изображения с помощью PHP Какой метод сжатия использовать в PHP? Выбор узлов с использованием xPath с объединениями Добавление столбца флажка в таблицы со значениями, динамически генерируемыми из базы данных в php PHP-скрипт для прокрутки всех файлов в каталоге?

laravel TokenMismatchException в ajax-запросе

Я использую группу ресурсов и использую этот фильтр для решения проблемы TokenMismatchException :

 Route::filter('csrf', function($route, $request) { if (strtoupper($request -> getMethod()) === 'GET') { return; // get requests are not CSRF protected } $token = $request -> ajax() ? $request -> header('X-CSRF-Token') : Input::get('_token'); if (Session::token() != $token) { throw new Illuminate\Session\TokenMismatchException; } }); 

мой маршрут:

 Route::group(array('prefix'=> 'admin', 'before' => 'csrf'), function(){ Route::resource('profile' , 'ProfileController', array('as'=>'profile') ); }); 

Теперь. Я получаю ошибку для запросов Ajax, таких как этот код:

 <script type="text/javascript"> $(document).ready(function() { $('#frm').submit(function(e){ e.preventDefault(); name = $('#name').val(); family = $('#family').val(); email = $('#email').val(); currPassword = $('#currPassword').val(); password = $('#password').val(); password_confirmation = $('#password_confirmation').val(); $.post("{{ route('admin.profile.update', $profile->id) }}", { _method : 'PUT', name : name, family : family, email : email, currPassword : currPassword, password : password, password_confirmation : password_confirmation }, function(data) { alert(data.errors.name); },'json'); return false; }); }); </script> 

ОШИБКА:

 {"error":{"type":"Illuminate\\Session\\TokenMismatchException","message":"","file":"\/var\/www\/alachiq\/app\/filters.php","line":83}} 

Я думаю, что я должен быть отправлен _token в $.post . но я не могу получить тег input с атрибутом name . iget эту ошибку:

 TypeError: 'stepUp' called on an object that does not implement interface HTMLInputElement. 

Related of "laravel TokenMismatchException в ajax-запросе"

В документах Laravel есть подсказка о том, как это сделать. Возможно, это было невозможно во время вопроса, но я подумал, что я бы обновил его с ответом.

http://laravel.com/docs/master/routing#csrf-x-csrf-token

Я проверил метод метатега из документации и получил его работу. Добавьте в свой глобальный шаблон следующий метатег

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

Добавьте этот JavaScript, который устанавливает значения по умолчанию для всех запросов ajax в jQuery. Предпочтительно в файле js, который включен в ваше приложение.

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

Этот токен может существовать в заголовке запроса или форме. Это заполняет его в заголовке запроса для каждого запроса ajax.

Вы должны вставить скрытый ввод с помощью _token, а затем получить это значение, как вы делаете, чтобы получить другие поля формы в своем сообщении ajax.

 <input type="hidden" name="_token" value="{{ csrf_token() }}" /> 

Другой метод,

На вашем представлении вы можете установить объект с помощью _token

 <script type="text/javascript"> var _globalObj = {{ json_encode(array('_token'=> csrf_token())) }} </script> 

и позже на ваш вызов ajax вы можете получить _token от объекта следующим образом:

 var token = _globalObj._token; 

и включите его в свой пост ajax.

Просто делайте простые вещи, как я показал в следующем коде,

  $.ajax({ type: 'POST', url: 'your-post-route-url', data: { "_token": "{{ csrf_token() }}", "form_data": $('#Form').serialize(), }, success: function (data) { console.log(data); }, error: function (reject) { console.log(reject); } }); 

Надеюсь, это самый простой способ решить эту проблему без какого-либо скрытого поля, и это работает для меня в версии laravel 5.4 🙂

Надеюсь, поможет.

Вы также можете добавить URL-адрес, который дает вам ошибку внутри файла VerifyCsrfToken.php в

 protected $except = [ // ] 

Допустим, ваш маршрут – сообщение. Вы можете просто добавить это

 protected $except = ['post', // ];`... 

Надеюсь, это поможет другим.

  <html> <head> <title>Ajax Example</title> <meta name="csrf-token" content="<?php echo csrf_token() ?>" /> <script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"> </script> <script type="text/javascript"> $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } }); </script> <script> function getMessage(){ $.ajax({ type:'POST', url:'/getmsg', data:'_token = <?php echo csrf_token() ?>', data:'', success:function(data){ $("#msg").html(data.msg); } }); } </script> </head> <body> <div id = 'msg'>This message will be replaced using Ajax. Click the button to replace the message.</div> <?php echo Form::button('Replace Message',['onClick'=>'getMessage()']); ?> </br> </body> </html> 

и VerifyCsrfToken.php файл добавить эту функцию

 protected function tokensMatch($request) { // If request is an ajax request, then check to see if token matches token provider in // the header. This way, we can use CSRF protection in ajax requests also. $token = $request->ajax() ? $request->header('X-CSRF-Token') : $request->input('_token'); return $request->session()->token() == $token; }