2017-05-17 5 views
0

In meinem Laravel 5.4, verwende ich den folgenden Code in meiner Ajax jQuery:Wie behandelt man Token Mismatch Exception in Laravel Post Ajax?

  $.ajax({ 
       url  : 'http://example.com/addmember', 
       method : 'POST', 
       headers: { 
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 
       }, 
       beforeSend : function() 
       {}, 
       data : $('#theForm').serialize(), 
       success : function(response) 
       { 
        // I do something here 
       }, 
       error : function(e) 
       { 
        console.log(e); 
       }, 
       complete : function(c){ 
       } 
      }); 

ich manchmal wie so eine Token Mismatch Ausnahme erhalten: enter image description here ich diesen Fehler im Allgemeinen erhalten, wenn der Benutzer auf bleibe die Seite für eine sehr lange Zeit vor dem Brennen der AJAX-Anfrage.

Wie kann ich mit der Situation umgehen?

Ich machte sogar eine Middleware, die bei einem Token-Mismatch bei einem AJAX-Aufruf eine Antwort wie response.status == "TOKEN-ERROR" zurückgibt, indem ich die Seite neu lade, die window.loaction.reload(1); verwendet.

Gibt es eine effizientere Methode, um die Situation zu bewältigen, ohne die Seite neu zu laden und damit den Fortschritt des Benutzers zu verlieren?

Antwort

1

In Ihre app/Exceptions/Handler.php Datei

einen Handler für TokenMismatchException im render Verfahren

hinzufügen

Dies wird eine Fehler-JSON-Antwort zurückgeben. Sie können die Fehlerreaktion an Ihre Anforderungen anpassen.

+1

Fair genug .. Ich habe bereits die JSON ich will, wie ich in der Frage erwähnt. Wie gehe ich mit diesem Fehler um, ohne die Seite zu aktualisieren? d. h. das korrekte (nicht abgelaufene) CSRF-Token erhalten? –

+0

Eine Möglichkeit wäre, eine Token-generierende Route zu verwenden, um ein neues Token bei einem Token-Mismatch-Fehler zu holen. – Sandeesh

+0

Wie kann ich das tun? –

0

Wenn ich einen Ajax-Aufruf bin mit, füge ich das _token Attribut auf die Daten:

$("input").on("someFunction", function(event) { 
     var score = $(this).val(); 
     var scoreId = $(this).data('score-id'); 
     $("#" + scoreId).text(event.value); 
     console.log(scoreId + ' => ' + score); 
     var data = { 
     "_token": "{{ csrf_token() }}", 
     "score": score, 
     "scoreId" : scoreId 
     }; 
     $.ajax({ 
      data: data, 
      type: "POST", 
      url: '{!! route('score.store', $id) !!}', 
      success: function (result) { 
      console.log(result); 
     }, 
     error: function (xhr, status, error) { 
     var err = eval("(" + xhr.responseText + ")"); 
     alert(err.error); 
     } 
    }); 
}); 

In meinem web.php füge ich diesen Artikel auf die Route:

Route::post('/path/to/route/{id}/score/store', [ 
    'before' => 'csrf', 
    'as' => 'score.store', 
    'uses' => 'Score\[email protected]' 
]); 
+0

Ich vermute '" _token ":" {{csrf_token()}} ",' und 'headers: { 'X-CSRF-TOKEN': $ ('meta [name =" csrf-token "]') .attr ('content') }, 'macht das Gleiche. erklären Sie bitte auch 'Middleware ('können: update-score, App \ Score');' –