Domanda

Ho una domanda in cui la maggior parte delle richieste vengono inviate tramite AJAX, sebbene alcune vengano inviate tramite "normale". Richieste HTTP. Se viene inoltrata una richiesta e la sessione dell'utente è scaduta, viene restituito il seguente JSON:

{"authentication":"required"}

La funzione JavaScript che invia tutte le richieste AJAX gestisce questa risposta mostrando un messaggio popup e reindirizzando l'utente alla pagina di accesso.

Tuttavia, quando una richiesta non AJAX riceve questa risposta, JSON viene semplicemente visualizzato nel browser perché la risposta viene elaborata direttamente dal browser (ovvero la funzione JavaScript di cui sopra viene ignorata). Ovviamente questo non è l'ideale e vorrei che le richieste non AJAX che ricevono questa risposta si comportino come le richieste AJAX. Per raggiungere questo obiettivo, posso pensare a 2 opzioni:

  1. Passa attraverso l'applicazione e converti tutte le richieste in richieste AJAX. Funzionerebbe, ma potrebbe anche richiedere molto tempo!

  2. Il JSON mostrato sopra è generato da un JSP molto semplice. Mi chiedo se potrebbe essere possibile aggiungere un gestore di eventi JavaScript a questo JSP che viene eseguito appena prima che il contenuto venga visualizzato nel browser - suppongo che questo non sarebbe mai stato chiamato per le richieste AJAX? Questo gestore può chiamare l'altro codice JavaScript che visualizza il popup ed esegue il reindirizzamento.

Se qualcuno sa esattamente come posso implementare il gestore che ho delineato in (2), o ha altre potenziali soluzioni, sarei molto grato se li trasmettessero.

Saluti, Don

È stato utile?

Soluzione

Non è possibile aggiungere un gestore a JSP in questo modo. Qualunque cosa tu aggiunga ad essa, la renderà una pagina che non produce JSON.

Ci sono due opzioni che posso vedere: Aggiungi un parametro alla pagina aggiungendo un parametro URL alla schermata che modifica l'output.

URL: http: //domain/page.jsp? ajaxRequest = true produrrebbe solo json

URL: http: //domain/page.jsp visualizzerebbe una pagina jsp che potrebbe inoltrare a un'altra pagina.

o

cambia la risposta per avere il codice di inoltro nel JSP che verrà eseguito dal browser web se viene colpito direttamente. Quindi chiedi a AJAX di rimuovere il codice di inoltro e quindi elaborare ciò che resta.

Altri suggerimenti

3) Modifica il codice AJAX per aggiungere una variabile a GET o POST: outputJson=1

4) Leggi l'intestazione HTTP della richiesta "Accetta".

Quindi, sul lato server, personalizzare l'output:

per es.

if(Accept contains application/json...) { // client asking for json, likely  to be XHR
  return {"foo":"bar"}
} else { // other
  return "Location: /login-please";
}

Inizia con un messaggio di errore più intelligente, come questo:

{"error":"authentication required"}

Avvolgere l'output JSON in un callback:

errorHandler({"error":"authentication required"});

Avere un gestore in attesa nel tuo script:

function errorHandler(r) {
   alert(r.error);
}

E non dimenticare di inviarlo come text / javascript e non application / x-json .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top