2015-09-23 15 views
32

Próbuję usunąć dane z bazy danych za pośrednictwem ajax.Laravel niedopasowanie tokenu csrf dla ajax POST Wniosek

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 mój kwerendy do pobierania danych z bazy danych ...

$a = Test::with('hitsCount')->where('userid', $id)->get()->toArray(); 

Ale kiedy kliknij Usuń dane łącza, które nie zostały usunięte i pokazać niezgodność csrf_token ...

Odpowiedz

64

Musisz dodać danych w żądaniu ajax. Mam nadzieję, że to będzie praca.

data: { 
     "_token": "{{ csrf_token() }}", 
     "id": id 
     } 
+4

Co zrobić, jeśli funkcja ajax znajduje się w pliku '.js'? – raBne

13

moim zdaniem jest lepiej umieścić żeton w formie i uzyskać ten token przez id

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

a jQuery:

var data = { 
     "_token": $('#token').val() 
    }; 

ten sposób twoje JS nie musisz znajdować się w plikach ostrzy.

7

Właśnie dodałem headers: w ajax rozmowy:

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

zdaniem:

<div id = 'msg'> 
    This message will be replaced using Ajax. Click the button to replace the message. 
</div> 

{{ Form::submit('Change', array('id' => 'ajax')) }} 

funkcji ajax:

<script> 
$(document).ready(function() { 
    $(document).on('click', '#ajax', function() { 
     $.ajax({ 
     type:'POST', 
     url:'/ajax', 
     headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')}, 
     success:function(data){ 
      $("#msg").html(data.msg); 
     } 
     }); 
    }); 
}); 
</script> 

w kontrolerze:

public function call(){ 
    $msg = "This is a simple message."; 
    return response()->json(array('msg'=> $msg), 200); 
} 

w routes.php

Route::post('ajax', '[email protected]'); 
+0

Dodawanie nagłówków do wywołania ajax pomógł mi. –

+0

To jest najlepsza odpowiedź, ponieważ nie wymaga JavaScript do pliku z ostrzami (chyba że chcesz go w pliku z ostrzami, ale następnie jest renderowany za każdym razem, gdy ktoś przychodzi na tę stronę) –

0

I rzeczywiście miał ten błąd i nie mógł znaleźć rozwiązanie. Właściwie to nie wykonałem żądania ajax. Nie wiem, czy ten problem wynikał z tego, że jest to subdomena na moim serwerze lub co. Oto moja jquery.

  $('#deleteMeal').click(function(event) { 
       var theId = $(event.currentTarget).attr("data-mealId"); 
        $(function() { 
        $("#filler").dialog({ 
         resizable: false, 
         height:140, 
         modal: true, 
         buttons: { 
         "Are you sure you want to delete this Meal? Doing so will also delete this meal from other users Saved Meals.": function() { 
          $('#deleteMealLink').click(); 
//       jQuery.ajax({ 
//        url : 'http://www.mealog.com/mealtrist/meals/delete/' + theId, 
//        type : 'POST', 
//        success : function(response) { 
//         $("#container").replaceWith("<h1 style='color:red'>Your Meal Has Been Deleted</h1>"); 
//        } 
//       }); 
         // similar behavior as clicking on a link 
          window.location.href = 'http://www.mealog.com/mealtrist/meals/delete/' + theId; 
          $(this).dialog("close"); 
         }, 
         Cancel: function() { 
          $(this).dialog("close"); 
         } 
         } 
        }); 
        }); 
       }); 

Więc faktycznie założyć kotwicę, aby przejść do mojego API zamiast robić żądania POST, która jest, co postać większość aplikacji zrobić.

<p><a href="http://<?php echo $domain; ?>/mealtrist/meals/delete/{{ $meal->id }}" id="deleteMealLink" data-mealId="{{$meal->id}}" ></a></p> 
42

Najlepszym sposobem rozwiązania tego problemu „X-CSRF token” jest dodanie następującego kodu do głównego układu, i nadal podejmowaniu ajax zwraca normalnie:

W nagłówku

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

W skrypcie

<script type="text/javascript"> 
$.ajaxSetup({ 
    headers: { 
     'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
    } 
}); 
</script> 
+2

Dzięki człowieku. To jest lepiej zaokrąglone rozwiązanie! W ten sposób po prostu ustawisz go raz, a potem zaczniesz pisać normalny kod $ .ajax. – pkid169

+1

To jest lepsze rozwiązanie, ponieważ można go używać w plikach '.js' – Adam

5

Jeśli używasz plików szablonów, możesz umieścić swój znacznik meta w nagłówku section (lub jakkolwiek go nazwiesz), który zawiera twoje znaczniki meta.

@section('head') 
<meta name="csrf_token" content="{{ csrf_token() }}" /> 
@endsection 

Następną rzeczą, trzeba umieścić atrybut headers do listy ajax (w moim przykładzie używam datatable z przetwarzaniem po stronie serwera:

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

Oto pełna datatable ajax przykład:

$('#datatable_users').DataTable({ 
     "responsive": true, 
     "serverSide": true, 
     "processing": true, 
     "paging": true, 
     "searching": { "regex": true }, 
     "lengthMenu": [ [10, 25, 50, 100, -1], [10, 25, 50, 100, "All"] ], 
     "pageLength": 10, 
     "ajax": { 
      "type": "POST", 
      "headers": {'X-CSRF-TOKEN': $('meta[name="csrf_token"]').attr('content')}, 
      "url": "/getUsers", 
      "dataType": "json", 
      "contentType": 'application/json; charset=utf-8', 
      "data": function (data) { 
       console.log(data); 
      }, 
      "complete": function(response) { 
       console.log(response); 
      } 
     } 
    }); 

Po wykonaniu tej czynności należy uzyskać 200 status na żądanie ajax.

1

jeśli używasz jQuery wysłać AJAX posty, dodaj ten kod do wszystkich widokach:

$(document).on('ajaxSend', addLaravelCSRF); 

function addLaravelCSRF(event, jqxhr, settings) { 
    jqxhr.setRequestHeader('X-XSRF-TOKEN', getCookie('XSRF-TOKEN')); 
} 

function getCookie(name) { 
    function escape(s) { return s.replace(/([.*+?\^${}()|\[\]\/\\])/g, '\\$1'); }; 
    var match = document.cookie.match(RegExp('(?:^|;\\s*)' + escape(name) + '=([^;]*)')); 
    return match ? match[1] : null; 
} 

laravel dodaje cookie XSRF do wszystkich żądań, a my automatycznie dołączyć go do wszystkich żądań AJAX tuż przed złożeniem.

Możesz zamienić funkcję getCookie, jeśli istnieje inna funkcja lub wtyczka jQuery, która robi to samo.

0

Powinieneś dołączyć ukryte pole tokenu CSRF (przekierowania do strony docelowej) w formularzu, aby oprogramowanie pośrednie CSRF protection mogło zatwierdzić żądanie.

Laravel automatycznie generuje "token" CSRF dla każdej aktywnej sesji użytkownika zarządzanej przez aplikację. Ten token służy do sprawdzania, czy uwierzytelniony użytkownik faktycznie zgłasza żądania do aplikacji.

Wykonując żądania ajax, musisz przekazać token csrf za pomocą parametru danych. Oto przykładowy kod.

var request = $.ajax({ 
    url : "http://localhost/some/action", 
    method:"post", 
    data : {"_token":"{{ csrf_token() }}"} //pass the CSRF_TOKEN() 
    }); 
Powiązane problemy