2015-10-28 14 views
5

Sto codificando un sito Web di aste in Laravel 5.0 che simula gli aggiornamenti in tempo reale utilizzando un poller AJAX che viene eseguito ogni 5 secondi. Il problema è che il mio server restituisce lo stato HTTP 401 sporadico.Laravel e AJAX errori sporadici 401 in un poller

Il mio percorso è costruito in questo modo:

Route::post(auction/live/update, '[email protected]'); 

mio controller è simile a questo:

public function ajaxSendUpdate() { 
    // Business logic: queries database, couple of Ifs, etc… 
    $data = array('success' => true, 'otherStuff' => $myData); 
    return Response::json($data); 
} 

Finalmente il mio poller è messa a punto in questo modo:

// a bit of HTML 
function getAuctionUpdate() { 
    setTimeout(function() { 
    $.ajax({ 
     type: "POST", 
     url: "{!! url('auction/live/update')!!}", 
      dataType: 'json', 
      data: { 
       auctionID: $('#auctionID').val() 
      }, 
      success: function (data) { 
       if (data['success']) { 
        // Updates some labels, etc. 
        getAuctionUpdate(); // Rearms itself 
       } 
      } 
    } }); // Not sure if all brackets are correct in this snippet but they are 100% on real code 
}, 5000); 

Questo codice funziona benissimo circa il 95% delle volte. Tuttavia può rompere con 2 risultati diversi:

1) Il server risponde dopo un po 'di tempo all'errore 401 e non si riprende mai. In questo scenario dobbiamo accedere di nuovo. Dopo il login, tutto va bene e questo risultato non si ripresenta mai più.

2) Il server risponde con il 401 sporadico ma recupera nelle richieste di polling successive (o dopo alcune).

Sto usando Laravel 5.0 e una versione aggiornata di Xampp su Windows. L'errore è facilmente riproducibile con WAMP su Windows. Non testato in Linux né OSX. Ho letto this e this e thread assortiti in laracasts.com e altri forum, ma non sono in grado di risolvere il problema ...

+0

Si ha un errore di sintassi. url: "{!!url ('auction/live/update') !!} ", – kotapeter

+0

Hai ragione ma quello era un problema con il copia incolla (ho anche tradotto il codice dalla mia lingua madre in inglese per essere più facile da leggere). bene ... –

+0

C'è anche questo, non sono sicuro se l'errore di copia come detto sopra: 'auctionID: $ ('# auctionID) .val()' spazio dopo '#' e manca la chiusura ''' dopo 'auctionID'. –

risposta

1

Dopo molte ore di test credo di aver risolto questo problema anche se non capisco completamente come e anche se questa è una risposta universale che può essere applicata a casi simili.

Nelle prime fasi di sviluppo ho avuto il middleware VerifyCsrfToken disabilitato in kernel.php quindi non ho inviato alcun _token con le mie richieste AJAX. Abilitando il middleware VerifyCsrfToken e inviando immediatamente il _token, tutti gli errori HTTP 401 scompaiono. Ora ho iniziato a ottenere un altro problema: ancora più sporadici errori HTTP 500. Una rapida occhiata ai log ha mostrato che tutti gli errori HTTP 500 erano causati da TokenMismatchException.

Mi sono imbattuto in this. Seguendo le istruzioni pagina web ho messo questo nella mia intestazione master.page:

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

E questo nel mio master.page javascript:

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

E in qualche modo è tutto a posto ora. Quindi, a tutti gli effetti, il mio problema originale è risolto ma non riesco ancora a capire:

1 - Perché ricevevo sporadici errori HTTP 401 quando non inviavo alcun _token con le mie richieste AJAX se avevo il middleware VerifyCsrfToken disabilitato in kernel.php?

2 - Perché ho iniziato a ricevere sporadicamente TokenMismatchException quando ho attivato il middleware VerifyCsrfToken in kernel.php se ho iniziato a inviare il _token con le mie richieste AJAX?

3 - Perché X-CSRF-TOKEN ha finalmente risolto il problema di errore HTTP 500? Tieni presente che tutti gli errori erano sporadici e non permanenti: rischierei di dire che dal 95 al 98% di tutte le richieste AJAX è andato bene, solo un piccolo numero di essi ha avuto qualsiasi problema.

Problemi correlati