A única maneira de fazer algo quando a página é fechada ou navegada é anexar um manipulador de eventos ao evento unload, como sugere o Rocket. No entanto, você não deve confiar nesse evento para ser acionado, pois muitas coisas podem impedi-lo. O navegador pode interrompê-lo para concentrar seus recursos em outras tarefas, o usuário pode perder a conexão, o navegador pode ser encerrado, etc.
A maneira mais confiável de acompanhar os usuários e a sessão é fazer com que eles enviem mensagens keepAlive para o servidor em um determinado intervalo. Então você saberá que o usuário saiu em algum momento entre um determinado timestamp e o intervalo da mensagem keepAlive.
No servidor, você pode percorrer as sessões que não foram mantidas ativas por um tempo e executar qualquer operação necessária.
No entanto, essa abordagem não será necessária se você precisar apenas criar um efeito legal de "log off".