Websocket: el cierre del navegador desencadena onError () en Chrome pero el evento onClose () en Firefox

Cuando cierra su navegador mientras tiene una conexión websocket activa, el siguiente comportamiento parece depender del navegador:

Firefox: desencadena onClose ().Internet Explorer: desencadena onClose ().

Chrome: Activará onErr (), el elemento arrojadizo no parece incluir un CloseReason.

01: 22: 47,428 ERROR [stderr] (tarea predeterminada-5) java.nio.channels.ClosedChannelException 01: 22: 47,429 ERROR [stderr] (tarea predeterminada-5) en io.undertow.server.protocol.framed.AbstractFramedChannel. recibir (AbstractFramedChannel.java:253) 01: 22: 47,429 ERROR [stderr] (tarea predeterminada-5) en io.undertow.websockets.core.AbstractReceiveListener.handleEvent (AbstractReceiveListener.java:20) 01: 22: 47,429 ERROR [stderr ] (tarea predeterminada-5) en io.undertow.websockets.core.AbstractReceiveListener.handleEvent (AbstractReceiveListener.java:15) 01: 22: 47,429 ERROR [stderr] (tarea predeterminada-5) en org.xnio.ChannelListeners.invokeChannelListener ( ChannelListeners.java:92) 01: 22: 47,429 ERROR [stderr] (tarea predeterminada-5) en io.undertow.server.protocol.framed.AbstractFramedChannel $ FrameReadListener.handleEvent (AbstractFramedChannel.java:615) 01: 22: 47,429 ERROR [stderr] (tarea predeterminada-5) en io.undertow.server.protocol.framed.AbstractFramedChannel $ FrameReadListener.handleEvent (AbstractFramedChannel.java:601) 01: 22: 47,429 ERROR [std err] (tarea predeterminada-5) en org.xnio.ChannelListeners.invokeChannelListener (ChannelListeners.java:92) 01: 22: 47,429 ERROR [stderr] (tarea predeterminada-5) en org.xnio.conduits.ReadReadyHandler $ ChannelListenerHandler.readReady (ReadReadyHandler.java:66) 01: 22: 47,429 ERROR [stderr] (tarea predeterminada-5) en org.xnio.nio.NioSocketConduit.handleReady (NioSocketConduit.java:87) 01: 22: 47,430 ERROR [stderr] (predeterminado tarea-5) en org.xnio.nio.WorkerThread.run (WorkerThread.java:531)

Traté de hacer una solución, atrapando el evento onbeforeunload ...

window.onbeforeunload = function () {
            console.log("closing window");
            return null;
        }

... pero parece que esto no es posible con las versiones actuales de Chrome.

¿Por qué Chrome activa onError (), en lugar de cerrar la conexión? No creo que sea un error, cuando un usuario cierra la ventana del navegador. En general, ya no es necesario el servicio web, por lo que el usuario cerrará la ventana.

Además, vea este hilo:¿Debería WebSocket.onclose ser activado por la navegación o actualización del usuario?

Tengo que llamar a OnClose () si se activa onError (), porque no puedo cerrar la conexión cuando un usuario de Chrome cierra la ventana.

@OnError
    public void onErr(Throwable t) {
        onClose(this.container.getWsSession(), null);

    }

No estoy seguro de si cada evento que activa onError () debería cerrar la conexión ...

Respuestas a la pregunta(0)

Su respuesta a la pregunta