webForumDet fria alternativet

Loggas ut

16 svar · 690 visningar · startad av Asa

AsaMedlem sedan dec. 20011 860 inlägg
#1

Vad är det bästa att bygga i ett community för att man skall loggas ut rätt även om man stänger ner webbläsaren utan att logga ut? Skall man använda sig av global.asa ? Eller finns det andra sätt som funkar bättre?

Hur har egentligen Lunarstorm t.ex?? Nån som vet?

N0M0NEYMedlem sedan juli 200543 inlägg
#2

Ehm om du menar att du ska använda detta till en online/offline text/bild och kolla de så behöver du ju inte göra de bara göra en datediff och kolla om tiden är t.ex 15 min senare än now() så skriver du Offline annars Online..
Annars om du inte ska de kan du använda javascript i body kan du använda attributet UnLoad..
sen byter du sida med javascript där den gör databaskoppling och ändrar..

NickemannenMedlem sedan aug. 20003 575 inlägg
#3

Är osäker på detta men.
onUnLoad körs väl inte när man stänger ner webbläsaren?

AsaMedlem sedan dec. 20011 860 inlägg
#4

onunload funkar väl inte i alla webbläsare eller?

OveRRidEMedlem sedan feb. 200112 078 inlägg
#5

Session unload ska man inte alltid lita på. ;)

Det inträffar när sessionen får timeout, alltså; tid vid sista aktivitet + timeout. Inte när webbläsaren stängs. Det har ingenting med webbläsare att göra.

AsaMedlem sedan dec. 20011 860 inlägg
#6

Har du tips på bästa sättet att lösa detta då?

OveRRidEMedlem sedan feb. 200112 078 inlägg
#7

Alltså, sessionen förstörs ju när sessionstimeout'en inträffar, så dessa variablar sköter ju sig själva. Det kan dock vara viktigt att tänka på dock, att sessionen ju är "förlorad" så fort webbläsaren faktiskt stängs, eftersom den är bunden till den specifika instansen av den.

Om du måste fixa i databasen eller liknande vid "utloggning", bygg in detta i session unload (använd inte server.mappath här), men se till att ha någon slags batch/körning, som rensar gamla utloggade användare, eftersom session unload kan vara lite.. vansklig ibland.

MelittaMedlem sedan sep. 2003448 inlägg
#8

Skulle det då inte vara smartare att köra en uppdatering av databasen med senast aktiv och sen datediff som någon sa? då slipper man ju allt krångel med utloggnings script och när det har gått låt oss säga 20 min så står anv som offline och problemet är löst, eller?

AsaMedlem sedan dec. 20011 860 inlägg
#9

Har denna som inte verkar funka som det ska. Loggar ut en iallafall fast man är aktiv:

UPDATE com_users, com_active SET com_users.status=0, com_active.status_var='Ej inloggad'
WHERE com_users.status=1 AND com_active.userid=com_users.userid
AND com_active.active_check <= (now() - interval 45 minute)

AsaMedlem sedan dec. 20011 860 inlägg
#10

Någon?

OveRRidEMedlem sedan feb. 200112 078 inlägg
#11

Melitta skrev:

Skulle det då inte vara smartare att köra en uppdatering av databasen med senast aktiv och sen datediff som någon sa? då slipper man ju allt krångel med utloggnings script och när det har gått låt oss säga 20 min så står anv som offline och problemet är löst, eller?

Fast, mitt exempel baserade sig på ifall man ville ändra i databasen med någorlunda precision när användaren faktiskt är utloggad/timeout'ad.

AsaMedlem sedan dec. 20011 860 inlägg
#12

Du får gärna visa hur du hade tänkt OveRRide. Kika på min kodsnutt och skriv hur du hade gjort... Om du har tid.

nordizMedlem sedan maj 200027 inlägg
#13

Ett relativt vanligt och sätt att göra det på är följande:

Steg A: Lagra rätt datan

1: Lägg till en kolumn som heter lastActive i din användardatabas

2: Varje gång användaren gör någonting på sidan så uppdaterar du denna kolumn till senaste datumet, t.ex: "update [user] set lastactive=getdate() where [id]=1234" .

Steg B: Visa statusen

Alternativ A:
Kontrollera det enkelt genom att använda en DateDiff i din sqlsats, t.ex. så här för microsoft sql: "SELECT datediff(minute, lastactive, getdate()) from [user] where [id]=1234" om då lastactive är mer än 15 så är användaren utloggad.

Alternativ B:
Lägg till ännu en kolumn i databasen på användartabellen som heter "online"

Steg 1: Varje gång användaren loggar in sätt online=1

Steg 2: Kör denna ett sql-kommando som uppdaterar statusen med jämna mellanrum, t.ex. en gång i minuten, t.ex. följande:

"update [user] set online=0 where datediff(minute, lastactive, getdate()) > 15"

Obs, alla exemplen ovan är för mssql och blir väl lite skillnad om ni t.ex. kör mysql, men principen bör vara den samma.

Självklart kan man även använda global.asa och liknande, men de är tyvärr inte fullt tillförlitliga då alla events inte triggas alltid!

//Johan

AsaMedlem sedan dec. 20011 860 inlägg
#14

Tackar för det Johan. Skall se vad som blir bäst.. :)

SannyWMedlem sedan jan. 2003438 inlägg
#15

Tjena Åsa,

Har läst, läst och åter läst. Men som alla andra saker som blir man mer förrvirrad av allt läsande ;)

En liten tråd som kan vara intressant:
http://www.webforum.nu/showthread.php?s=&postid=524934#post524934

Hoppas att OveRRide som den guru han är, visar hur han tänkte tidigare i tråden. Men fram tills dess får man ju spekulera vilt vad som är den bästa lösningen....

Global.asa känns som den bästa och ända lösningen på problemet att någon kommer att stänga läsaren eller att gå vidare till ny sida. För om jag förstått det rätt då så dödas sessions variablerna då.

Dock kan man få samma sessionID trots att man kört session.abandon. Så man kan inte se sessions-ID:et som en indikering på att en ny session har startats.

Kanske det rent av kan vara ide att köra båda lösningar till viss del. Känns dock lite overkill, men man borde väl vara så gott som "hemma" då :) (global.asa, timeout mot databas och att man kan logga ut)

Lycka till!

SprayMaphiaMedlem sedan jan. 2004128 inlägg
#16

Jag har till mitt community använt global.asa och det fungerar klockrent.

LAde till en kolumn i min DB som heter sid och som innehåller Session.SessionID när man loggar in. Sedan under Session_OnEnd uppdaterar jag tabellen med "rätt" Session.SessionID bara.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#17

SannyW: Sessionen dör inte så fort användaren lämnar sidan/stänger ner webbläsaren. Den dör endast direkt om man anropar Session.Abandon t.ex. vid klick på logga ut.
Annars tar det så lång tid som du angett som Session.Timeout från sista aktiviteten från användaren till att sessionen dör och Session_OnEnd anropas.

Det är alltså inte så exakt att använda sig av global.asa. Det skulle alltså räcka ganska bra med att bara köra databasvarianten där man hela tiden loggar all aktivitet.

Men jag tycker det känns dumt att bygga koden så att man måste ha en batch som ligger och kör och ska uppdatera en kolumn som bara säger om medlemmen är inloggad. Det blir bara mer att underhålla och sen så är det ganska vanligt att folk här kör på webbhotell där de inte kan lägga upp schemalagda aktiviteter.

Mitt tips är att bygga så här:
Vid varje sidvisning när man är inloggad:

UPDATE tblUser SET UserLastActiveDate = GETDATE() WHERE UserId = 1234

När man loggar ut:

UPDATE tblUser SET UserLastActiveDate = NULL WHERE UserId = 1234

När man vill presentera inloggade användare:

SELECT * FROM tblUser WHERE DATEADD(n, 15, UserCreationDate) >= GETDATE()
143 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)