Pregunta

Tengo una aplicación en la que la mayoría de las solicitudes se envían a través de AJAX, aunque algunas se envían a través de " regular " Peticiones HTTP Si se envía una solicitud y se agota el tiempo de espera de la sesión del usuario, se devuelve el siguiente JSON:

{"authentication":"required"}

La función de JavaScript que envía todas las solicitudes AJAX maneja esta respuesta mostrando un mensaje emergente y redirigiendo al usuario a la página de inicio de sesión.

Sin embargo, cuando una solicitud no AJAX recibe esta respuesta, el JSON simplemente se muestra en el navegador porque la respuesta es procesada directamente por el navegador (es decir, la función de JavaScript mencionada anteriormente se omite). Obviamente, esto no es ideal y me gustaría que las solicitudes que no son AJAX que reciben esta respuesta se comporten igual que las solicitudes AJAX. Para lograr esto, puedo pensar en 2 opciones:

  1. Ir a través de la aplicación y convertir todas las solicitudes a solicitudes AJAX. Esto funcionaría, pero también podría llevar mucho tiempo.

  2. El JSON que se muestra arriba es generado por un JSP muy simple. Me pregunto si es posible agregar un controlador de eventos de JavaScript a este JSP que se ejecuta justo antes de que se muestre el contenido en el navegador. ¿Supongo que esto nunca se llamará para las solicitudes AJAX? Este controlador podría llamar al otro código JavaScript que muestra la ventana emergente y realiza la redirección.

Si alguien sabe exactamente cómo puedo implementar el controlador que describí en (2), o si tiene alguna otra solución potencial, le agradecería que lo hicieran.

Saludos, Don

¿Fue útil?

Solución

No puede agregar un controlador a la JSP de esa manera. Cualquier cosa que le agregues lo convertirá en una página que no produce JSON.

Hay dos opciones que puedo ver: Agregue un parámetro a la página agregando un parámetro de URL a la pantalla que modifica el resultado.

URL: http: //domain/page.jsp? ajaxRequest = true solo daría salida a json

URL: http: //domain/page.jsp mostraría una página jsp que podría reenviar a otra página.

O

cambie la respuesta para que tenga el código de reenvío en la JSP que ejecutará el navegador web si se golpea directamente. Luego pida a su AJAX que llama que elimine el código de reenvío y luego procese lo que queda.

Otros consejos

3) Cambie su código AJAX para agregar una variable a GET o POST: outputJson=1

4) Lea en el encabezado HTTP de solicitud 'Aceptar'.

Luego, en el lado del servidor, adapte la salida:

por ejemplo

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

Comience con un mensaje de error más inteligente, como este:

{"error":"authentication required"}

Envuelva la salida JSON en una devolución de llamada:

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

Tenga un controlador esperando en su script:

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

Y no olvides enviarlo como text / javascript y no como application / x-json .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top