Eu sei que isso tem uma grande chance de ser marcado como duplicado, mas não consegui encontrar exatamente o que estou procurando
Esse é um problema comum e tenho certeza de que possui uma solução de melhores práticas bem definida
fundo
Um aplicativo SaaS de página única, com muito arrastar e soltar, o usuário pode interagir com ele sem muita comunicação com o servidor por períodos de tempo
A sessão do servidor mantém apenas o objeto do usuário, usando um cookie de sessão não persistente
A sessão expira no servidor após X horas
Algumas coisas são carregadas apenas durante o login
Problema
- O usuário trabalha no aplicativo; quando concluído, o usuário não efetua logout, apenas mantém o navegador aberto
- O usuário volta após mais de X horas (a sessão é invalidada no servidor)
- O usuário interage com o aplicativo sem precisar de uma conexão com o servidor (arrasta e solta itens, edições de texto ...)
- Somente na próxima interação do servidor (suponha que não haja salvamento automático) o usuário é lançado na página de login e perde parte do trabalho
Soluções possíveis
Aqui estão algumas soluções que eu tenho em mente, gostaria de saber se existem outras, e se há algo fundamentalmente errado com alguma delas.
1. Nunca desconecte o usuário
- Como? mantenha uma sessão longa, mantenha um cookie persistente ou javaScript "keep alive" ping
- Prós : o usuário não precisa se preocupar com nada, corrige o problema para eles
- Contras : não é compatível com PCI, não é seguro e precisa de alterações no desenvolvimento, por exemplo, coisas carregadas na sessão apenas no logon do usuário precisam passar para um submodelo de publicação (ouvindo alterações de eventos) ou ter tempo limite de cache.
2. Armazenamento local
- Como? use o novo armazenamento local para armazenar temporariamente o estado se estiver desconectado, redirecione para a página de login, persista após o login
- Prós : Baseie -se também no suporte ao "trabalho offline", e não apenas ao lidar com o tempo limite da sessão
- Contras : mais difícil de implementar, precisa mesclar estado da árvore de dados, nem todos os navegadores suportam
3. Salvamento automático
Toda ação do usuário que altera o modelo deve persistir imediatamente (ou através de algum tipo de fila do lado do cliente), por exemplo, se marcar uma caixa de seleção, alterar um campo de texto ou arrastar e soltar algo, após concluir, persistem as alterações.
- Como? Use uma estrutura MV ** (Backbone.js / Knockout.js / Ember.js / Angular.js etc) para vincular o modelo e persistir nas alterações.
- Prós : Parece uma solução limpa, a sessão fica ativa enquanto o usuário estiver ativo, nenhum trabalho do lado do cliente é feito sem persistir.
- Contras : A última ação do usuário após a perda de um tempo limite da sessão.
4. Desconecte o usuário após o término da sessão
isso pode ter várias abordagens
Pergunte ao servidor "a sessão expirou" - isso é um pouco complicado para o gato de 22 / Schrodinger, pois a mera pergunta ao servidor estende a sessão (reinicia o tempo limite),
- Como? Você tem um servidor que suporta essa pergunta (não conheço nenhuma, mas venho do Java land) ou pode-se manter uma tabela de IDs de sessão e o último horário de acesso manualmente e perguntar ao servidor passando a sessão O ID como parâmetro, em vez do cookie, não tenho certeza se isso é possível, mas parece perigoso, inseguro e com design inadequado de qualquer página.login, persiste após o login
- Prós : se houver esse suporte nativo nos servidores, isso soa como uma pergunta limpa e legítima (perguntar se o usuário X ainda tem uma sessão ou não, sem renová-la, se houver)
- Contras : Se o servidor não o suportar (e novamente, não sei se algum servidor ou estrutura tem essa funcionalidade), a solução alternativa apresenta enormes riscos à segurança.
Uma solução alternativa que ouvi foi ter uma sessão curta no lado do servidor e um ping ativo no lado do cliente, com um número máximo de pings
- Como? Sessão curta no servidor, o cliente faz ping em cada sessionTimeOut / 2, tem tentativas máximas de Y.
- Prós : tipo de solução do problema, rápida e suja
- Contras : Parece um hack, manipular você mesmo a renovação da sessão, em vez de permitir que o servidor faça isso
Temporizador do lado do cliente
Como? Tenha um cronômetro no lado do cliente e sincronize-o com o servidor, reiniciando-o em cada solicitação para que seja igual ao tempo limite máximo da sessão do servidor menos algum preenchimento, depois que o usuário não enviar nenhuma solicitação ao servidor, a interface do usuário mostrará "sessões são prestes a expirar, você deseja continuar? " (como você tem no banco on-line)
Prós : corrige o problema
- Contras : Não consigo pensar em nada, exceto na necessidade de garantir que a sincronização funcione
A questão
Provavelmente estou perdendo algo na análise acima, pode haver alguns erros tolos e gostaria que sua ajuda para corrigi-los. Que outras soluções posso ter para isso?
now
. 4.2 parece uma ótima maneira de matar o servidor e aumentar os custos 4.3 No Android, ao retornar à tela inicial, tenho certeza de que o processo está em pausa e que também pode interferir no timer do cliente.