Получение несоответствия токена CSRF Laravel - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь отправить форму с javascript, но получаю эту ошибку CSRF token mismatch. Я попытался изменить var url = "{{ route('review.store') }}"; на {{ route('review.store') }}?_token={{ csrf_token() }}, и он отправлял форму в базу данных без данных. Я видел много вопросов, похожих на это, но у меня не было решения для моего случая. Как я могу это исправить?

<form id="form" enctype="multipart/form-data">
    <input type="hidden" value="{{csrf_token()}}" id="token"/>
<div class="form-group" >
<label for="title">Title</label>
<input type="text" name="title" >
</div>

<div class="form-group">
<label for="description">Description</label>
<input type="text" name="description">
</div>
</form>
<input type='button' value="Submit" id="btn"/>

Javascript

var token = $("#token").val();
$(document).ready(function(){

$("#btn").click(function(event){
event.preventDefault();
var url = "{{ route('review.store') }}";
var form = $('#form')[0];
var formData = new FormData(form);
formData.append('_token', token);
$.ajax({
    url: url,
    data: formData,
    type: 'POST',
    cache: false,
    contentType: false,
    processData: false,
    success:function(data){
    if($.isEmptyObject(data.error)){
    $("#msg").html("successfull");
    $("#msg").fadeOut(3000);
     }
    }
});
});

});

Маршрут

  Route::resource('review','ProductReviewController');

Ответы [ 6 ]

0 голосов
/ 17 марта 2020

Лучший способ решить эту проблему «X-CSRF-TOKEN» - это добавить следующий код в основной макет и продолжить обычные вызовы ajax:

В заголовке

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

В форме добавьте токен csrf в любом месте внутри формы

<form>
{{ csrf_field() }}
</form>

В скрипте

<script type="text/javascript">
$.ajax({
    url: url,
    data: formData,
    type: 'POST',
    cache: false,
    contentType: false,
    processData: false,
    headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    success:function(data){
    if($.isEmptyObject(data.error)){
    $("#msg").html("successfull");
    $("#msg").fadeOut(3000);
     }
    }
});

</script>

Я надеюсь, он будет работать для вас

0 голосов
/ 17 марта 2020

вы все еще можете попробовать это. я забираю тег формы и токен csrf в форме

// form

    <div class="form-group" >
    <label for="title">Title</label>
    <input type="text" id="title" name="title" >
    </div>

    <div class="form-group">
    <label for="description">Description</label>
    <input type="text" id="description" name="description">
    </div>
    </form>
    <input type='button' class="btn-submit" value="Submit" id="btn"/>

// ajax call

<script>
$(function() {
   $(".btn-submit").click(function(e){

        var title= $("input[name=title]").val();

        var description= $("input[name=description]").val();


        $.ajax({
              url: murl +'/your-url',
              type: "post",
              data: {'title':title, 'description':description, '_token':  $('input[name=_token]').val()},
              success: function(data){

              console.log(data);

              }


        });


    });


});



</script>
0 голосов
/ 17 марта 2020

попробуйте использовать @csrf или {{ csrf_field() }}

0 голосов
/ 17 марта 2020

Попробуйте использовать это, пожалуйста, а затем сериализовать данные формы

<form id="form" enctype="multipart/form-data">    
    {{csrf_field()}}
    <div class="form-group" >
        <label for="title">Title</label>
        <input type="text" name="title" >
    </div>
    <div class="form-group">
        <label for="description">Description</label>
        <input type="text" name="description">
    </div>
    <input type='button' value="Submit" id="btn"/>
</form>
0 голосов
/ 17 марта 2020

В вашем jquery, пожалуйста, получите токен, как это:

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

Вы также можете попробовать как

    data: {
       "_token": "{{ csrf_token() }}",
       "id": myid
    }

Так что ваш ajax запрос будет

$.ajax({
  url : "url",
  method:"post",
  data : {
    "_token": $('#csrf-token')[0].content
  },
  // Other stuffs to do
});
0 голосов
/ 17 марта 2020

Вам не хватает имени _token в скрытом поле, просто сериализуйте форму и отправьте запрос

    <form id="form" enctype="multipart/form-data">

    <input type="hidden" name ="_token" value="{{csrf_token()}}" id="token"/>
    <div class="form-group" >
    <label for="title">Title</label>
    <input type="text" name="title" >
    </div>

    <div class="form-group">
    <label for="description">Description</label>
    <input type="text" name="description">
    </div>
<input type='button' value="Submit" id="btn"/>

    </form>


$(document).ready(function(){

$("#btn").click(function(event){
event.preventDefault();
var url = "{{ route('review.store') }}";
var formData = $('#form').serializeArray();
$.ajax({
    url: url,
    data: formData,
    type: 'POST',
    cache: false,
    contentType: false,
    processData: false,
    success:function(data){
    if($.isEmptyObject(data.error)){
    $("#msg").html("successfull");
    $("#msg").fadeOut(3000);
     }
    }
});
});

});
...