detecção JSON carregado pelo navegador
-
05-07-2019 - |
Pergunta
Eu tenho uma aplicação em que a maioria dos pedidos são submetidos via AJAX, embora alguns são submetidas através de "regulares" HTTP solicitações. Se um pedido for apresentado e a sessão do usuário expirou, a seguinte JSON é retornado:
{"authentication":"required"}
A função JavaScript que apresenta todas as requisições Ajax alças esta resposta, mostrando uma mensagem pop-up e redirecionar as costas do usuário para a página de login.
No entanto, quando um pedido de não-AJAX recebe esta resposta o JSON é simplesmente mostrada no navegador, porque a resposta é processada directamente pelo navegador (isto é, a função JavaScript acima mencionado é ignorada). Obviamente, isso não é ideal e eu gostaria que os pedidos não-Ajax que recebem essa resposta para comportar o mesmo que as solicitações de AJAX. A fim de conseguir isso, eu posso pensar de 2 opções:
-
Go através da aplicação e converter todos os pedidos para solicitações de AJAX. Isso poderia funcionar, mas também poderia levar um longo tempo!
-
O JSON mostrado acima é gerado por um muito simples JSP. Eu estou querendo saber se seria possível adicionar um manipulador de eventos JavaScript para este JSP que é executado mesmo antes de conteúdo é exibido no navegador - Estou assumindo isso nunca seria chamado para solicitações de AJAX? Este manipulador pode chamar o outro código JavaScript que exibe o pop-up e executa o redirecionamento.
Se alguém sabe exatamente como eu posso implementar o manipulador eu esbocei em (2), ou tem quaisquer outras soluções possíveis, eu ficaria muito grato se eles passá-los.
Cheers, Don
Solução
Você não pode adicionar um manipulador para o JSP dessa forma. Qualquer coisa que você adicionar a ele irá torná-lo uma página não produtores de JSON.
Existem duas opções que eu posso ver: Adicionar um parâmetro para a página anexando um parâmetro de URL para a tela que modifica a saída.
URL: http:? //Domain/page.jsp ajaxRequest = true Será que json saída somente
URL: http: //domain/page.jsp exibiria uma página jsp que poderia avançar para uma outra página.
ou
mudar a resposta para ter o código de encaminhamento na JSP que serão executados pelo navegador da web se ele é atingido diretamente. Então, o seu chamando AJAX para retirar o código de encaminhamento, e em seguida, processar o que está à esquerda.
Outras dicas
3) Alterar o código AJAX para adicionar uma variável para o GET ou POST: outputJson=1
4) Leia-se sobre o pedido 'Aceitar' cabeçalho HTTP.
Em seguida, na medida do lado do servidor a saída:
por exemplo.
if(Accept contains application/json...) { // client asking for json, likely to be XHR
return {"foo":"bar"}
} else { // other
return "Location: /login-please";
}
Comece com uma mensagem de erro mais inteligente, como este:
{"error":"authentication required"}
Enrole a saída de JSON em um callback:
errorHandler({"error":"authentication required"});
Tenha um manipulador de espera no seu script:
function errorHandler(r) {
alert(r.error);
}
E não se esqueça de enviá-lo para baixo como text/javascript
e não application/x-json
.