Avatar billede mecenor Nybegynder
04. august 2005 - 23:38 Der er 9 kommentarer og
2 løsninger

Sikre at brugeren sættes til logget-ud i database.

Som det er nu, så bliver en person sat til 'loggetind' i databasen, så samme brugernavn ikke kan være logget ind med mere end en session. Men hvis personen ikke logger ud (hvorved personen sættes til loggetind = false i db), men blot lukker browseren, så står personen stadig som logget ind.
Jeg har prøvet at gemme bruger-id som sessionvariable og så kører et log-ud script når sessionen løber ud, men det virker ikke. Kan man overhovedet gøre på denne måde? Hvis ja, er der så noget galt i koden?

global.asa:

<SCRIPT LANGUAGE=VBScript RUNAT=Server>

SUB Session_OnStart

    Session("medlemid") = 0

END SUB

Sub Session_OnEnd

    Dim RS
   
    Set rs = Server.CreateObject("ADODB.Recordset")
        strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("log/db.mdb")
        rs.Open sqlstr, strDSN, 1, 3
   
    RS.Open ("SELECT * FROM Medlemmer where id = "& Session("medlemid") &"")
   
    IF NOT RS.EOF THEN
        RS.Fields("Loggetind") = FALSE
        RS.Update
    END IF
   
    RS.close
    Set RS = nothing


End Sub
</SCRIPT>
Avatar billede softspot Forsker
04. august 2005 - 23:53 #1
Dette løser ikke nødvendigvis dit problem, men det gør koden lidt "tyndere":

Set con = Server.CreateObject("ADODB.Connection")
strDSN = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("log/db.mdb")
con.open strDSN
con.Execute("UPDATE Medlemmer SET Loggetind = False WHERE id = " & Session("medlemid"))
con.close

Prøv evt. at lægge denne rutine over i en separat asp-fil som du så kalder fra dit Session_OnEnd-event således:

Server.Execute "logoutscript.asp"
Avatar billede busschou Praktikant
05. august 2005 - 07:50 #2
Jeg har lige skrevet en artikkel om global.asa hvor jeg slutter af med et eksempel som logger brugeren af
http://www.eksperten.dk/artikler/752
Prøv læse artikelen, den burde forklare hvad du kan og ikke kan
Du kan fx sagtens logge folk ud når sessionen dør
Du skal jo bare være klar over at hvis session.timeout er sat til 20 , ja så går der 20minutter før sessionen dør, og dvs der går 20minutter før brugeren står som offline
Avatar billede busschou Praktikant
05. august 2005 - 07:52 #3
Af andre ting du kan læse i artiklen er at Session_OnEnd ikke med garanti kører!
Derfor ville jeg , hvis jeg var dig, tillade at et bruger kan logge ind selvom man står som logget ind. Jeg mener, man må jo stole på at ikke andre kender brugerens kodeord

Endvidere er et problem med din løsning at du benytter Server.Mappath i din session_onend og det kan man ikke, du får en fejl, men da sessionen er død og man ikke kan udskrive til skærmen i session_onend, ja så ser du aldrig denne fejl, du konstaterer blot at din database ikke bliver opdateret :o)
Avatar billede busschou Praktikant
05. august 2005 - 08:55 #4
iøvrigt har jeg endnu ikke set et "fornuftigt virkende" eksempel på hvordan man logger brugeren ud lige så snart vedkommende lukker browseren
Du kan i IE evt benytte fange javascripts event onBeforeUnLoad
Ulempen er så at den kun kan fanges i IE og at det kræver at brugeren har tilladt javascripts samt ikke spærrer popups :o)
Avatar billede mecenor Nybegynder
05. august 2005 - 12:35 #5
OK, det her kom til at virke:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>

Sub Application_OnStart

Application("db") = "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="&Server.MapPath("log/db.mdb")
   
End Sub

SUB Session_OnStart

Session("medlemid") = 0

END SUB

Sub Session_OnEnd
   
Dim conn
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open Application("db")
conn.Execute("UPDATE Medlemmer SET Loggetind = False WHERE id = " & Session("medlemid"))
conn.close

End Sub
</SCRIPT>

Tak for hjælp med at 'slanke' min kode, softspot, læg et svar.

God artikel busschou, godt timet! Vidste ikke at man ikke kunne bruge Server.Mappath i Session_OnEnd.

I IE virker <body onBeforeUnLoad="<%session.Abandon()%>">, mens det ser ud til at Firefox kører onBeforeUnLoad med det samme siden loades, i.e. session.Abandon(), så snart man rammer en ny side...?

Kan man være sikker på at brugeren ved session.timeout logges ud, hvis Session_OnEnd ikke med garanti kører? Hvis man ikke kan køre en session.Abandon() på fx Firefox, så bliver brugeren ved med at stå som logget ind?
Avatar billede busschou Praktikant
05. august 2005 - 12:40 #6
Hvordan kan denne her virke??
<body onBeforeUnLoad="<%session.Abandon()%>">
onBeforeUnLoad er jo javascript, kan man bare putte session.abandon ind der?
Det ville jeg ikke tro man kunne, for det er jo server script og ikke klient

Desværre kan man ikke være sikker på at Session_OnEnd køres. Jeg har ikke set nogen statestik over hvor tit det sker at den ikke kører. Jeg har oplevet det nogle få gange.
Man skal bare være klar over det, så man fx ikke låser en bruger fra at logge ind hvis han grundet dette altid står som logget ind.
Avatar billede mecenor Nybegynder
05. august 2005 - 12:48 #7
Hmm, nej <body onBeforeUnLoad="<%session.Abandon()%>"> virker ikke, dvs. <%session.Abandon()%> bliver bare kørt med det samme, med body ved load.

Så hvis man skal sikre sig at en bruger ikke bliver 'låst ud', så skal man ikke låse kontoen?
Avatar billede busschou Praktikant
05. august 2005 - 12:53 #8
nej det synes jeg ikke man skal
Som jeg ser det har jeg kun et kodeord til min webmail, men hvis jeg logger ind herhjemme, og så går på job uden at logge af, hvorfor skulle jeg så ikke måtte logge ind igen, uanset om der er gået 5,10,20 eller flere minutter?
Avatar billede mecenor Nybegynder
05. august 2005 - 13:02 #9
Ja, det ville også pisse mig af :)
Dilemmaet her er, at kunderne opnår rabat, når de er logget ind og firmaet vil undgå misbrug. Løsningen er at logge køb med brugernavn, tidspunkter, IP og glemme login?!
Avatar billede softspot Forsker
06. august 2005 - 02:49 #10
Bare et lille svar - jeg tror busschou har den største del af æren i dette spørgsmål...
Avatar billede mecenor Nybegynder
06. august 2005 - 08:38 #11
Takker begge.

(Og i min forrige kommentar mente jeg selvfølgelig ikke 'glemme login', men at i stedet 'ikke sætter brugeren til logget ind').
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