studio programacion event closing close java browser

java - event - manual de programacion android pdf



¿Qué sucede cuando hago clic en el botón Detener en el navegador? (5)

Digamos que hago clic en un botón en una página web para iniciar una solicitud de envío. Luego, de repente, me doy cuenta de que algunos datos que he proporcionado son incorrectos y que, si se presentan, enfrentaré consecuencias no deseadas (algo así como una solicitud de compra en la que podría verse obligado a pagar por esta solicitud incorrecta).

Así que hago clic frenéticamente en el botón Detener no solo una vez sino muchas veces (por si acaso).

¿Qué sucede en tal escenario? ¿El navegador simplemente cancela la solicitud sin informar al servidor? Si en caso de que lo haga, informe al servidor, ¿el servidor simplemente cancela el proceso o también realiza un relanzamiento de todas las acciones realizadas como parte de esta solicitud?

Codigo en Java. ¿Tiene Java alguna característica especial que podamos usar para detectar solicitudes de DETENCIÓN y deshacer lo que hayamos hecho como parte de esta transacción?


Dado que esta pregunta puede atraer la atención de las personas que no usan Java, pensé que mencionaría el comportamiento de los PHP con respecto a esta pregunta, ya que es muy sorprendente.

PHP internamente mantiene un estado de la conexión con el cliente. Los valores posibles son NORMAL, ABORTADO y TIMEOUT. Mientras que el estado de la conexión es NORMAL, la vida útil es buena y el script continuará ejecutándose como se esperaba.

Si el usuario hace clic en el botón Parar en su navegador, el cliente generalmente cierra la conexión y el estado cambia a ABORTADO. Un cambio de estado a ABORTED terminará inmediatamente la ejecución del script en ejecución. Por otro lado, sucede lo mismo cuando el estado cambia a TIMEOUT (se excede la configuración de PHP para el tiempo de ejecución permitido de los scripts).

Este comportamiento puede ser útil en ciertas circunstancias, pero hay otros en los que podría ser problemático. Parece que debería ser seguro abortar en cualquier momento durante una solicitud GET adecuada; sin embargo, abortar en medio de una solicitud que hace un cambio en el servidor podría llevar a cambios solo parcialmente completados.

Consulte la entrada del manual de PHP sobre el Manejo de la conexión para ver cómo evitar complicaciones derivadas de este comportamiento:

http://www.php.net/manual/en/features.connection-handling.php


El cliente inmediatamente dejará de transmitir datos y cerrará su conexión. 9 de cada 10 veces su solicitud ya habrá finalizado (tal vez debido a que los búferes del sistema operativo se "vacían" al servidor). No se envía información adicional al servidor informándole que detuvo su solicitud.


En términos generales, el servidor no sabrá que ha pulsado detener, y se completará el proceso del lado del servidor. En el momento en que el servidor intenta enviar los datos de respuesta al cliente, es posible que vea un error porque la conexión se cerró, pero igualmente puede que no. Lo que no obtendrá es que el hilo del servidor se interrumpe repentinamente.

Puede usar varios mecanismos elaborados para mitigar esto, como hacer que el envío envíe frecuentes llamadas ajax al servidor que dicen "aún esperando", y haga que el servidor realice su procesamiento en un nuevo hilo que verifique estas llamadas, pero eso no resuelve el problema completamente


La carga de una página web desde un navegador suele ser un proceso de 4 pasos (sin considerar las redirecciones):

  1. El navegador envía solicitud HTTP, cuando el servidor está disponible
  2. El servidor ejecuta el código (para páginas dinámicas)
  3. El servidor envía la respuesta HTTP (generalmente HTML)
  4. El navegador representa HTML y solicita otros archivos (imágenes, css, ...)

La reacción del navegador a "Detener" depende del paso que su solicitud es en ese momento:

  • Si su servidor está lento o sobrecargado, y presiona "Parar" durante el paso 1, no ocurre nada. El navegador no envía la solicitud.
  • La mayoría de las veces, sin embargo, se detendrá en los pasos 2, 3 y 4, y en esos pasos su código ya está ejecutado, el navegador simplemente deja de esperar la respuesta (2) o recibir la respuesta (3) , o dando la respuesta (4).

La llamada HTTP en sí es siempre una acción de 2 pasos (Solicitud / Respuesta), y no hay forma automática de deshacer la ejecución desde el cliente


Su presentación en escenarios importantes debe tener dos etapas. Verificar y enviar Si el envío final pasa, usted comete cualquier tranacción. No puedo pensar en otra forma de evitar esa situación, que no sea permitir que el usuario deshaga sus acciones después de un commit. por ejemplo, el ejemplo de orden, después de que se realiza el pedido para permitir a sus clientes cambiar de opinión y encaminar el pedido si aún no se ha enviado. Por supuesto, su código adicional que necesita escribir para suportar eso.