2013-01-15 2 views
11

Sto chiamando un'API tramite javascript utilizzando una chiamata jQuery.ajax. L'API risponde con 401 se l'utente non è autenticato e voglio ignorare questo errore solo per questa chiamata.Eliminare un errore ajax 401 (non autorizzato) nella console del browser

Ho provato tutte le opzioni di callback descritte nelle opzioni jQuery ma l'errore si verifica ancora nella console del browser (sia in Firefox che in Chrome).

Ecco un esempio di codice che innescano l'errore:

$.ajax({ 
    type: 'GET', 
    url: '/url-with-auth', 
    dataType: 'json', 
    statusCode: { 
     401: function (error) { 
      // simply ignore this error 
      console.log(error); 
     } 
    }, 
    complete: logall, 
    error: function() { 
     // simply ignore this error 
     console.log(error); 
    }, 
    async: false 
}).fail(function() { 
     // ignore the error and do nothing else 
     console.log("$.get failed!"); 
    }); 

Questo ha anche l'effetto collaterale di chiedere ancora una volta le credenziali di utente in una macchina messa in scena, che è protetto da un file .htaccess in quanto il browser pensa che l'utente non è autenticato, quindi nelle richieste successive l'utente deve immettere nuovamente le sue credenziali http.

C'è un modo per ignorare completamente questo errore?

Modifica

Attualmente ho un modello HTML che è interamente nella cache lato applicazione e voglio mantenere questo comportamento per motivi di prestazioni. L'unica parte che cambia nel layout sono le informazioni di accesso per l'utente corrente, quindi sto rendendo la pagina (memorizzata nella cache) con il markup predefinito per gli utenti non registrati e quindi usando jQuery I sostituisco gli elementi rilevanti del markup con informazioni di accesso restituite da una chiamata Ajax. Quindi se l'utente non è loggato e l'endpoint ajax restituisce 401 non ho bisogno di nulla, il markup dovrebbe rimanere lo stesso.

Tutto sta funzionando in questo momento, l'unica cosa brutta è che ho quell'errore di javascript 401 nella console e mi piacerebbe sbarazzarmene.

Ecco uno screenshot del messaggio di cui sto parlando:

console error

+0

si potrebbe guardare http://stackoverflow.com/questions/10267683/jquery-ajax-handle-401-unauthorized –

+0

@RachelGallen già ha fatto e ha cercato tutto il suggerimento lì, il gestore viene eseguito, ma l'errore è ancora mostrato.Mi piacerebbe evitarlo completamente perché in questo caso lo script è destinato ad aggiungere un elemento dom solo quando l'utente è loggato e se non lo è voglio semplicemente ignorare la chiamata. – Fabio

+0

hmm vabbè, spero di trovare presto una risposta. –

risposta

-1

si può aggiungere un campo nascosto nella pagina (sto cercando di indovinare la sua generati dinamicamente) come:

<input type="hidden" name="isLoggedIn" value="true" (or false) /> 

Poi in voi javascript, metto

if ($('input[name=isLoggedIn"]').val() == "true") 
{ 
    //your ajax call here 
} 
+0

Abbastanza francamente, non penso che la maggior parte degli utenti guardi la console. L'unico motivo per cui utilizzo la console è per lo sviluppo o se un sito si comporta in modo strano – allanx2000

+0

So come scrivere codice condizionale ;-) Il requisito principale è quello di non modificare l'html per gli utenti registrati al fine di avere il modello completamente memorizzabile nella cache. Questo codice rompe questo requisito. – Fabio

+0

C'è qualcosa nella pagina che indicherebbe che l'utente ha effettuato l'accesso? usa jquery per cercare il valore dell'elemento al posto di isLoggedIn – allanx2000

3

inoltre ho fatto funzionare in questo problema e voleva sopprimere l'eccezione nella console JavaScript per errori HTTP 401 e 404 ecc. Ho trovato questa domanda e non ho visto il motivo per cui i gestori error() e statusCode() non hanno messo a tacere l'eccezione, quindi ho fatto il mio stesso scavo in esso.

Per quanto ne so, si tratta di un problema con l'oggetto XMLHttpRequest nativo di ajax nel browser, non con jQuery. Per dimostrare questo ho usato il seguente codice di prova:

function xhrTest(index) { 
    var ajaxObjects = [ 
     $.ajaxSettings.xhr(), // what jquery returns 
     new XMLHttpRequest() // the native one in the browser 
    ]; 
    var ajax = ajaxObjects[index]; 
    ajax.onreadystatechange = function() {console.log("xhrTest: state: " + ajax.readyState)}; 
    var errorHandler = function() {console.log("xhrTest: error");}; 
    ajax.onerror = errorHandler; 
    ajax.onabort = errorHandler; 
    ajax.open("GET", "/fileThatDoesNotExist", true); 
    ajax.send();  
} 

Si noti che quando si chiama questo (ho fatto dalla console JavaScript) sia con xhrTest (0) o xhrTest (1), che bypassa jQuery, che i risultati sono gli stessi:

same results whether jQuery is used or not