Pergunta

Eu estou fazendo modificações para um site de membros com base em cujo proprietário quer ser capaz de controlar o tempo gasto no local (login / logout) para todos os usuários em um backend DB. Entrada é fácil; há um ponto de entrada (o formulário de login) e, como resultado, logins pode ser jogado no banco de dados assim que eles acontecem.

logouts, no entanto, são um pouco mais complicado, pois a menos que o usuário clicar em 'Sair' para deixar explicitamente nos saber que eles estão deixando a solução fica mais peludo (e quantas vezes os usuários realmente clique em sair? ). Uma possibilidade (apenas em termos de rastreamento de tempo total no site) seria a de registrar cada pageload no banco de dados e associá-lo com o usuário que carregou-o; o problema com isto é que o site é um site de entrega de vídeo baseado em assinaturas (não o que você está pensando!) e sua última exibição de página é provavelmente vai ser um vídeo vinte ou trinta minuto. Precisamos capturar que o tempo gasto nessa última página, bem como -. Não apenas o momento em que foi carregado

Já pensei duas soluções possíveis, nenhuma das quais é tudo o que elegante. A primeira seria a armadilha todos os eventos 'descarregamento' via javascript e registrar uma chamada para 'logout.php' (isto assumindo o XMLHttpRequest ou o que quer que não morra assim que a página é descarregada); o problema não é que as ligações internas também registrar-se como eventos descarregar, por isso clicando em qualquer link iria registrar o usuário para fora (você pode verificar uma bandeira no manipulador de 'descarga', e tem todas as ligações internas definir essa bandeira - não é difícil de fazer dinamicamente, mas um kludgy bit). A outra abordagem envolveria a criação de um intervalo de ping o DB a cada 60 s ou menos, o que nos permite saber que o usuário ainda está no local, e, em seguida, fazer um pouco de matemática quando puxar a história do usuário para descobrir o comprimento total da sessão ; que também parece tipo de hackish. Além disso, nenhuma dessas soluções funcionar para usuários com JS desabilitado.

Parece que este problema não é tão incomum, e não tem que ser uma maneira melhor; há uma abordagem de melhores práticas para resolver isso? Se não, você vê alguma maneira de melhorar qualquer uma destas soluções?

Foi útil?

Solução

A web não é construído para permitir o rastreamento preciso dos eventos de logout. Você simplesmente não está garantido para obter notificação do navegador quando os quites usuário, portanto, em circunstâncias normais, o melhor que você pode esperar é para interceptar o evento tempo limite da sessão, e esse evento pode não fogo até 20 minutos após o usuário abandonou a página .

Agora você poderia melhorar isso um pouco, colocando uma solicitação ajax em um temporizador em cada página (talvez uma ou duas vezes por minuto) para fornecer um "piscar de olhos", mas isso tem algumas ressalvas assim: Você precisa ter certeza de a sessão será ainda tempo limite e você ainda não está garantido que o usuário não irá bloquear esses pedidos, talvez desativando o JavaScript.

Outras dicas

Eu tive um bom sucesso com o uso de temporizador em javascript para ping do servidor. No meu caso, o site requer javascript de modo que este não é um problema. Eu também usar esse mecanismo para executar uma verificação que impede que uma única conta de ser logado de duas máquinas diferentes para que haja razões mais convincentes para fazer este corte.

Uma coisa a ter em mente com descarga é o seu ainda não guarenteed que o evento de descarregamento dispara sempre. Você vai ter pessoas em laptops que, por exemplo, basta fechar o laptop, então a abordagem temporizador vai probally ser um pouco mais preciso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top