2016-06-08 16 views
0

Ich habe eine form innerhalb einer div.TokenMismatchException in Laravel 5.0

<div class="form-container col-sm-12 container-fluid"> 
<meta content="{{ csrf_token() }}" name="_token"> 
<form class="form" id="register_form" method="POST" novalidate> 
    <!-- <input type="hidden" value="{{ csrf_token() }}" name="_token" id="token"> --> 
    <div class="form-group" id="error_msg"></div> 
    <div class="form-group name">       
     <input type="text" class="form-control input-sm" role="group" id="name" placeholder="Name" name="name" required>     
    </div> 
    <div class="form-group email"> 
     <input type="email" class="form-control input-sm" id="email" placeholder="Email" name="email" required>  
    </div> 
    <div class="form-group contact_no"> 
     <input type="text" class="form-control input-sm" id="contact_no" placeholder="Contact No" name="contact_no" required> 
    </div> 
    <div class="form-group select_level"> 
     <select class="form-control input-sm" name="level_interested" id="level_interested" required> 
      <option class="form-control" selected disabled value="">Level Interested</option> 
      <option class="form-control" value="bachelor">Bachelor</option> 
      <option class="form-control" value="masters">Masters</option> 
      <option class="form-control" value="phd">Phd</option> 
      <option class="form-control" value="nursing">Nursing</option> 
     </select> 
    </div> 
    <div class="form-group select_country"> 
     <select class="form-control input-sm" name="country_interested" id="country_interested" required> 
      <option class="form-control" selected disabled value="">Country Interested</option> 
      <option class="form-control" value="usa">U.S.A</option> 
      <option class="form-control" value="australia">Australia</option> 
      <option class="form-control" value="canada">Canada</option> 
      <option class="form-control" value="india">India</option> 
      <option class="form-control" value="new_zealand">New Zealand</option> 
     </select> 
    </div> 

    <div class="form-group"> 
     <button type="submit" class="btn btn-success btn-sm">Register</button> 
    </div> 
</form>  

Wenn die form vorgelegt wird, wird die Validierung weitergeführt. Nach erfolgreicher Validierung verwende ich Ajax, um Eingabedaten zu senden und eine Warnmeldung als Antwort anzuzeigen.

form.submit(function() { 
     if(validateName() & validateEmail() & validateContact_No() & validateLevel() & validateCountry()) { 

      $.ajaxSetup({ 
       headers: { 
        'X-CSRF-Token': $('meta[name="_token"]').attr('content') 
       } 
      }); 

      $.ajax({ 
       type : 'post', 

      url: "{{ route('save_registry') }}", 

      data: { 
       'name' : name.val(), 
       'email' : email.val(), 
       'contact_no' : contact_no.val(), 
       'level_interested' : level_interested.val(), 
       'country_interested' : country_interested.val(), 
      }, 

      success : function(data) { 

        alert(data); 

      } 
     }); 
      return true; 
     } else { 
      $('#error_msg').text("Please Enter Details Correctly").show().addClass('text-danger').addClass('text-center'); 
      return false; 
     } 

Das ist mein function in einem Controller die Anfrage zu bearbeiten.

public function save_registry(Request $request) 
{ 


    $new_registry = new Register(); 

    $email = Register::where('email','=',$request->email)->exists(); 
    if($email==true) 
    { 
     return 'Email already exists'; 
    } 
    else{ 
     $new_registry -> name = $request -> name; 
     $new_registry -> email = $request -> email; 
     $new_registry -> contact_no = $request -> contact_no; 
     $new_registry -> level_interested = $request -> level_interested; 
     $new_registry -> country_interested = $request -> country_interested; 
     $new_registry->save(); 
     return 'Registered Successfully'; 
    } 
} 

Nachdem ich die form einreichen, alert knallte wird. Und nachdem ich die Warnung geschlossen habe, bekomme ich TokenMismatchException Fehler. Ich erhalte diesen Fehler nur, wenn der form's methodPOST nicht in GET ist. Gibt es also eine Lösung, um den Fehler nicht zu bekommen, wenn methodPOST ist?

+0

Lesen der Dokumente haben Sie versucht X-CSRF-TOKEN anstelle von X-CSRF-Token nicht sicher, ob die Kopfzeile Groß-und Kleinschreibung ist –

+1

Header ist nicht Groß-und Kleinschreibung. Ich erhalte nur 'TokenMismatchException', nachdem das 'Formular' erfolgreich abgeschickt wurde. 'Form'-Daten werden ebenfalls erfolgreich in die Datenbank eingefügt. 'Alert' mit dem Nachrichtenformular' controller's Funktion erscheint ebenfalls. Aber nachdem ich die "Warnung" geschlossen habe, bekomme ich 'TokenMismatchException'. Wenn 'token' nicht übereinstimmte, hätte ich den Fehler direkt nach dem' submit' erhalten, nicht nach dem Schließen des 'alert'. –

+0

klingt wie Sie brauchen, um zu verhindern, dass das ursprüngliche Formular dann reicht, fügen Callback-Variable e, um Funktion zu senden und 'e.preventDefault();' –

Antwort

1

Laravel sucht nach einem Attribut mit der Bezeichnung _token, wenn Sie ein Formular über POST senden. Ich sehe, Sie haben dies bereits in einem <meta> Tag, so haben Sie zwei Methoden, um dies zu bekommen, wenn Sie POST Ihr Formular.

Erstens können Sie ein neues <input type="hidden" name="_token" value="{{ csrf_token() }}"/> Element irgendwo in Ihrem <form> erstellen und sicherstellen, dass über Ihre Ajax übergeben wird, wenn das Verfahren ist POST:

data: { 
    '_token' : _token.val(), 
    'name' : name.val(), 
    'email' : email.val(), 
    'contact_no' : contact_no.val(), 
    'level_interested' : level_interested.val(), 
    'country_interested' : country_interested.val(), 
}, 

Alternativ kann, da Sie bereits den conent in a haben <meta> Tag können Sie umfassen sie nur in Ihrer ajax wie so:

data: { 
    '_token' : $('meta[name="_token"]').attr('content'), 
    'name' : name.val(), 
    'email' : email.val(), 
    'contact_no' : contact_no.val(), 
    'level_interested' : level_interested.val(), 
    'country_interested' : country_interested.val(), 
}, 

Unabhängig davon, wie Sie es tun, nur sicherstellen, dass in y dass _token Attribut haben unsere POST Daten, und es sollte für Sie arbeiten. Ich hoffe, das hilft!

Verwandte Themen