Minha solução para esse problema é que o usuário tenha um problema de intervalo de tempo ativo. Aqueles que ultrapassarem esse intervalo de tempo ativo podem ser considerados offline. Este último pode estar logado. Se o último não estiver logado, não significa que o primeiro precise fazer login novamente. Porque a sessão dele ainda está lá. Este tempo só pode ser definido tão pequeno quanto possível e mais preciso, mas não pode ser absoluto.
O código é postado para referência do autor da postagem.
Função CheckOnline()
DIM IP,rsPrv,Sql,PrvDbState
PrvDbState = Falso
Se DBSTATE = Falso então
DbOpen()
PrvDbState = Verdadeiro
Terminar se
Definir rsPrv=Server.CreateObject(ADODB.Recordset)
Se Sessão(NomeUsuário) = então
Sql=select * de [Online] onde SessionID='& Session.Sessionid &'
rsPrv.Open Sql,Conn,1,3
Se rsPrv.Eof então
rsPrv.AddNovo
rsPrv(SessionID) = Sessão.SessionID
rsPrv(GroupChargeLv) = -1
rsPrv(LastActTime) = Agora()
rsPrv(UserIP) = ObterIP
rsPrv(TempoOnLine) = 0
rsPrv(UserWhere) = Request.ServerVariables(HTTP_REFERER)
Outro
rsPrv(UserWhere) = Request.ServerVariables(HTTP_REFERER)
rsPrv(OnLineTime) = rsPrv(OnLineTime) + DateDiff(n,rsPrv(LastActTime),Agora())
rsPrv(LastActTime) = Agora()
Terminar se
rsPrv.Atualizar
rsPrv.Fechar()
'resposta.Escreva notlogin
Outro
'response.Write logado
Sql=select * de [Online] onde UserName='& Session(UserName) &'
rsPrv.Open sql,Conn,1,3
Se rsPrv.Eof então
rsPrv.AddNovo
rsPrv(SessionID) = Sessão.SessionID
rsPrv(NomeUsuário) = Sessão(NomeUsuário)
rsPrv(GroupChargeLv) = Sessão(GroupChargeLv)
rsPrv(LastActTime) = Agora()
rsPrv(TempoOnLine) = 0
rsPrv(UserIP)= ObterIP
rsPrv(UserWhere) = Request.ServerVariables(HTTP_REFERER)
Outro
Se rsPrv(SessionID) <> Session.SessionID And Application(LoginSet)(1) = False Então
InfoTo LoginOut.asp, esta conta foi logada em outro lugar, o site só pode ter 1 login por ID/nVocê pode tentar fazer login mais tarde.
Resposta.End()
Terminar se
rsPrv(UserWhere) = Request.ServerVariables(HTTP_REFERER)
rsPrv(OnLineTime) = rsPrv(OnLineTime) + DateDiff(n,rsPrv(LastActTime),Agora())
rsPrv(LastActTime)=Agora()
Terminar se
rsPrv.Atualizar
rsPrv.Fechar()
Terminar se
Definir rsPrv = Nada
Se DateDiff(s,Application(OnLineLastDelete),Now()) > Int(Application(DELETEONLINEDIFF)) Então
Aplicativo.Lock()
Aplicativo(OnLineLastDelete) = agora
Aplicativo.UnLock()
Conn.ExeCute(delete from [Online] where datedIff('s',LastActTime,Now())>& Int(Application(CHECKONLINEDIFF) &)) 'Excluir visitantes que estiveram inativos por x segundos
Terminar se
Se PrvDbState = True então DbClose()
Função final