Avatar billede miwu.tk Nybegynder
16. februar 2009 - 15:02 Der er 7 kommentarer og
1 løsning

Tælle aktive sessions

jeg har en hjemmeside, hvor man skal skrive en simpel lille kode for at komme ind på gæstebogen. Når man logger ind får man så tildelt et login session.

Nu vil jeg så gerne have mulighed for, at man på siden kan se hvor mange aktive login-sessions der er - så man kan se antal personer logget ind.

Jeg har skrevet flg. når man logger ind:
<%
    if request.QueryString("action") = "login" and request.Form("login") = "password" then
       
            Session("login") = True
            Session.Timeout = 60
            response.Redirect("/")

    else if request.QueryString("action") = "abandon" then
            Session.Abandon
            response.Redirect("/")
   
    Else

        response.write ("")
   
    End If
    End If
%>

Nu ved jeg så bare ikke hvad man ellers skal gøre for at tælle de aktive "login"-sessions...
Avatar billede Slettet bruger
16. februar 2009 - 15:24 #1
Avatar billede softspot Forsker
16. februar 2009 - 16:34 #2
Du bør nok lave en kombination af et loginscript (som du har gjort) og så lægge noget kode i global.asa, hvor der kommer system-events for start og slut på session. Det er primært slut du vil være interesseret i, da det jo først er ved login du ønsker at tælle brugeren som online og det er man jo ikke nødvendigvis bare fordi en session starter.

Derfor er min anbefaling følgende:

1. Ved login registreres dette i application, f.eks. i pseudokode i loginscriptet:

if loginOK then
  application.lock
  application("logincounter") = application("logincounter") + 1
  application.unlock
  session("login") = true
end if


2. Ved manuel logoff registreres dette i application, i pseudokode:

if logoffOK then
  application.lock
  application("logincounter") = application("logincounter") - 1
  application.unlock
  session.contents.remove "login"
end if


3. i global.asa i session_onend-eventet, igen i pseudokode:

if session("login") = true then
  application.lock
  application("logincounter") = application("logincounter") - 1
  application.unlock
end if


Således burde du være sikret både at folk ikke registreres som online for tidligt og ikke er registreret længere end deres session løber...
Avatar billede miwu.tk Nybegynder
16. februar 2009 - 17:21 #3
Mange tak, det var lige hvad jeg ledte efter! Jeg har havde godt nok arbejdet med det forslag Visual foreslog, men jeg synes metoden virker utrolig unøjagtig, i og med der skabes en session ved hvert besøg.... sådan firkantet set.

Men Softspot, din løsning lader til at passe perfekt til mig. Tager din løsning dog også forbehold for, at den skal tælle ned i antal online, når en session udløber? (Fx, hvis man går væk fra sin computer). Jeg kan ikke lige helt se mig ud af det nemlig...

Desuden... fungerer

session.contents.remove "login"

ligeså godt som

Session.Abandon

... og hvad er egentlig forskellen?
Avatar billede miwu.tk Nybegynder
16. februar 2009 - 17:37 #4
arh... tror jeg har fattet en smule. Dvs. hvis jeg skriver sådan her i min global.asa, så ved den at der er tale om Session("login") der udløbes. Hmm... men er den ikke lidt selvmodsigende, når session skal være aktiv for at det virker?

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">

Sub Session_OnEnd(login)

if session("login") = true then
  application.lock
  application("logincounter") = application("logincounter") - 1
  application.unlock
end if
end Sub

</SCRIPT>
Avatar billede softspot Forsker
16. februar 2009 - 23:46 #5
Det der sker er at når session rammer sin timeout på en time (siden sidste gang denne session blev kontaktet af brugeren), så kaldes Session_OnEnd i global.asa for denne session. Det er HELE session der fjernes fra hukommelsen, så derfor skal der ikke fjernes noget fra session i dette kode (det sker automatisk i og med session helt nedlægges).

En ting du lige skal være opmærksom på er, at Session_OnEnd ikke tager nogen parameter, så din global.asa skal se således ud:

<SCRIPT LANGUAGE="VBScript" RUNAT="Server">

Sub Session_OnEnd()
  if session("login") = true then
    application.lock
    application("logincounter") = application("logincounter") - 1
    application.unlock
  end if
end Sub

</SCRIPT>


Den foreslåede kode skulle gerne både tage højde for at tælle onlinebrugere ned, når brugeren selv vælger at logge af og når serveren ikke længere gider vente på at brugeren foretager sig noget og timer session ud.

Når jeg kalder

Session.Contents.Remove "login"

i stedet for

Session.Abandon

så er det for at lave et mere nøjagtigt indgreb i session, da det jo kunne tænkes at du brugte session til andet end lige at holde styr på hvem der er logget ind. I så fald vil Remove-metoden kun påvirke selve login. Du kan naturligvis godt bruge Session.Abandon, hvis du er 100% sikker på at session ikke bruges til andet end login-styring. Remove-metoden adskiller sig desuden fra Abandon-metoden ved at login er fjernet umiddelbart efter den linie som kalder Remove, hvor login-variablen ved Abandon-metoden eksisterer indtil siden (request) er helt  afsluttet. Det betyder i praksis at du med Abandon-metoden kan få adgang til login-variablen efter session.abandon er kaldt... om du så foretrækker den ene frem for den anden er op til dig :)
Avatar billede miwu.tk Nybegynder
16. februar 2009 - 23:56 #6
Ja, ok... der gik virkelig lige nogle lys op for mig. Tusind tak for hjælpen!

Synes du skal høste dine velfortjente point nu :)
Avatar billede softspot Forsker
17. februar 2009 - 00:02 #7
Velbekomme :)
Avatar billede softspot Forsker
17. februar 2009 - 08:12 #8
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester