Back-End

7 nov, 2016

Gerenciando abas de navegador com JSF

Publicidade

Um caso problemático para quem desenvolve para web é o gerenciamento de abas nos navegadores. Algumas soluções web podem perder o sincronismo ou até gerar inconsistências de dados, caso o usuário final abra várias abas diferentes e faça login simultâneos e ou use a solução dessa forma. Como controlar ou inibir isso? Depois de semanas pesquisando, cheguei a algumas conclusões.

A primeira opção que você encontra nos fóruns por aí é fazer esse controle no client via javascript. Essa opção é complicada, difícil de fazer, não tem compatibilidade com navegadores padrões e principalmente de mobile e ainda não garante 100% de seu funcionamento.

O que me restou foi tentar algo no server. Depois de alguns dias pensando na situação, eu e alguns brothers conseguimos implementar uma lógica simples que mistura o pattern de sincronized token + gerenciando de scopo web java e assim conseguimos inibir tal situação. Como ficou? Segue:

1- Criamos um bean no escopo session que armazenou um token qualquer, único que controlaria seu fluxo de navegação:

1

2- Criamos um bean no escopo view, amarrada em cada tela do usuário, que controlaria um outro token único cada vez que ele entre em uma interface gráfica web. Cada vez que usuário acessa uma GUI diferente, esse bean gerará um novo token e alimenta o bean de sessão com o identificador:

2

3- Em cada interface gráfica, colocamos o identificador com display none no html, armazenando no navegador de cada usuário a respectiva ficha que determina a última interface gráfica que ele entrou. Espalhamos esse código em toda as páginas da solução sem DRY, via template facelets:

3

Dessa forma, passamos a ter o controle de quando um usuário deixou uma página aberta, abrindo uma nova aba do navegador e acessando outras páginas dentro do mesmo sistema. No nosso caso, a solução foi emitir uma mensagem de bloqueio antes de cada post de transação no qual sofreria situações de inconsistências.

Segue um exemplo abaixo da validação antes da ação JSF:

4

O ponto chave da logica é: se o token da sessão for diferente do token corrente da view, foi que o abelhudo do usuário abriu outra aba e navegou em outras páginas do mesmo sistema. Cada um pode adaptar para outros casos.

E foi assim que resolvemos esse problema, do lado de server, usando Java, 100% compatível com todos navegadores, inclusive mobile, já em produção há 1 ano com sucesso! Até a próxima!