Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Croves

Sistema de login "inteligente"

Recommended Posts

Olá pessoal! Já faz um tepo que venho pensando em como resolver este problema, mas gostaria de ouvir outras opiniões.

 

Eu preciso que no meu sistema tenha uma listagem contendo os usuários (no meu caso, meus clientes) que estão online no sistema naquele momento, e que eu consiga desconectar esses usuários remotamente, ao clicar em um botão. Eu também preciso impedir que o mesmo usuário faça login mais de uma vez em outra máquina e/ou navegador.

 

Eu pensei em criar uma flag na tabela do meu banco de dados e utiliza-la p/ esse controle. Porém, o problema está quando o usuário fecha o navegador, sem clicar no botão de sair. Se ele fizer isso, terei que ficar manualmente alterando a flag para que ele possa fazer o login novamente.

 

Estou procurando alternativas melhores para meu problema. Todo comentário é bem vindo.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estabeleça um "timeout", se o usuário ficar X minutos em inatividade mude a flag para desconectado e pronto, óbvio que isto tem o problema da pessoa ficar parada na página os X minutos, mas ai você pode implementar algo igual o BB faz, que é um contador no topo da página que mostra quanto tempo existe até o timeout.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O timeout não é uma boa ideia, porque nesse meu sistema o usuário chega a ficar mais de 30 minutos na mesma página, sem enviar requisições para o servidor. Já tentei aplicar algo parecido, e tive muitos problemas.

 

O usuário demorava 40 minutos para terminar de preencher o formulário, e quando tentava salvar, o sistema redirecionava para a tela de login e o cliente perdia todo o trabalho feito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Tambem nao e interessante pelo mesmo motivo que citei acima.

 

Eu tentei tambem fazer uma requisição AJAX no onunload() do navegador, mas é complicado, pois o onunload() é executado toda vez que a página sofre um unload - e isso inclui atualizar a página ou clicar em um link.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então coloque uma requisição persistente na página, assim o você começará a contar o timeout apenas se o usuário fechar a janela do sistema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente isso.

 

<script language="javascript">
function fnUnloadHandler() {
  xmlhttp=null; 
  if (window.XMLHttpRequest) 
     {// code for Firefox, Opera, IE7, etc. 
        xmlhttp=new XMLHttpRequest(); 
     } 
  else if (window.ActiveXObject) 
     {// code for IE6, IE5 
        xmlhttp=new ActiveXObject("Msxml2.XMLHTTP"); 
     } 

  if (xmlhttp!=null) 
     {  
        xmlhttp.open("GET","http://yourhost/del_cart_actionFile.php",true); 
        xmlhttp.send(null); 
     } 
     else 
     { 
        alert("Your browser does not support XMLHTTP."); 
     } 
}
</script>
<body onbeforeunload="fnUnloadHandler()">
</body>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então coloque uma requisição persistente na página, assim o você começará a contar o timeout apenas se o usuário fechar a janela do sistema.

 

Voce poderia dar mais detalhes de como seria essa requisicao persistente?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A cada X horas/minutos/segundos (o que você achar mais conveniente), você manda um requisição por ajax para o servidor, essa requisição atualiza uma tabela com a data/hora, com isto você vai saber sem a pessoa precisar navegar no site que ela está com a janela aberta, baseado nisto você consegue determinar se ela fechou a janela, pois a partir disto ela não vai mais atualizar a data/hora, ai você aplica o timeout. Vale ressaltar que isto tem várias maneiras de ser feito, um simples JS com um contador regressivo, que quando chegar no zero dispara a requisição e volta para o tempo inicial (para quando chegar no zero novamente, disparar de novo a requisição), ou algo mais evoluido como o comet (onde o servidor vai requisitar no navegador do usuário).

Compartilhar este post


Link para o post
Compartilhar em outros sites

A cada X horas/minutos/segundos (o que você achar mais conveniente), você manda um requisição por ajax para o servidor, essa requisição atualiza uma tabela com a data/hora, com isto você vai saber sem a pessoa precisar navegar no site que ela está com a janela aberta, baseado nisto você consegue determinar se ela fechou a janela, pois a partir disto ela não vai mais atualizar a data/hora, ai você aplica o timeout. Vale ressaltar que isto tem várias maneiras de ser feito, um simples JS com um contador regressivo, que quando chegar no zero dispara a requisição e volta para o tempo inicial (para quando chegar no zero novamente, disparar de novo a requisição), ou algo mais evoluido como o comet (onde o servidor vai requisitar no navegador do usuário).

 

Haja memoria para isso... :( :( :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vale ressaltar que isto tem várias maneiras de ser feito, um simples JS com um contador regressivo, que quando chegar no zero dispara a requisição e volta para o tempo inicial (para quando chegar no zero novamente, disparar de novo a requisição), ou algo mais evoluido como o comet (onde o servidor vai requisitar no navegador do usuário).g.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas Edgar, creio que se o site houver muitos acessos pode pesar o servidor, não?

Conceitue "muitos acessos"... tenho cliente que tem picos de 40 mil acessos por hora em um servidor, é muito? Se comparar com a wikipedia não...

 

Não existe um milagre... pode ser um ajax com contador ou o comet, ambos vão consumir memória/processamento, qualquer requisição vai consumir memória e processamento, simples assim... além disso, ele não precisa fazer uma requisição a cada 10s, se ele sabe que tem gente que vai demorar 30~40 minutos na página, bota uma requisição a cada 5~10 minutos e pronto, isso vai consumir tanto quanto uma leitura/resposta de um post aqui mesmo no fórum.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, a sua melhor solução é o timeout sim.

 

Vc precisa fazer um javascript para que ele chame de X em X tempo um ajax que atualiza esse timeout.

 

Ou seja, se ele fechar o navegador, esse ajax vai deixar de ser chamado e vai dar o timeout em algum momento.

Se ele ficar 2 dias com o navegador aberto, o ajax vai atualizar por dois dias esse timeout.

 

É essa a onda que vc tem que pegar amigo.

 

@edit

 

 

Perdão, não tinha visto que o ESerra comentou exatamente isso que falei.

Ele está certo.

 

Nem se usa tanto recurso assim, vc tem que tomar alguns cuidados: se um ajax executar, tem que verificar se o anterior por algum caso ainda não tá rolando e dar um KILL caso esteja.

 

Isso não ferra o servidor galera, é algo muito rápido, e claro, otimize bem o código que vai atualizar esse timeout. Não fique abrindo e fechando a conexão pra todas as consultas, tente reaproveitar conexões e outras coisas que vc pode fazer para melhorar em tudo. O facebook tem milhões de usuários e estão todos dando ajax a cada poucos segundos para verificar se tem atualizações, novas conversas no chat e etc.

 

Não é um monstro, blz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.