[ASP] Wie-lijst: hoe aanpakken?

Pagina: 1
Acties:
  • 141 views sinds 30-01-2008
  • Reageer

  • CmdrKeen
  • Registratie: Augustus 2000
  • Laatst online: 27-05 21:11

CmdrKeen

Krentenboltosti

Topicstarter
Ik heb een site waar users op kunnen inloggen. Nu wil ik er een soort wie-lijst aan vastplakken, maar dan zonder van WIE gebruik te maken. (Dit is WIE.) Dus dat als je op de site komt, je een lijstje ziet van welke gebruikers er op die site zijn op dat moment.

De users die ingelogd zijn, hebben allemaal een sessievariabele Session("user") met daarin de username. Door gebruik te maken van een applicatievariabele Application("userlist") is het mogelijk om de lijst van ingelogde gebruikers weer te geven, maar ik zit vast bij de sessie-timeout.

Gebruikers horen natuurlijk uit te loggen (Session.OnEnd of zo?), en dan is het gemakkelijk: als een user uitlogt, z'n naam verwijderen uit de applicatievariabele. Maar lang niet altijd meldt een user zich netjes af, en moet je wachten tot de sessie is getime-out.

Ik heb al flink wat voorbeelden van w3schools zitten uitproberen, maar ik kom er niet meer uit.

Kan iemand me vertellen hoe ik dit aan moet pakken? Ik hoef geen heel script te hebben, maar ik zou wel heel blij zijn als ik weet het systeem er in grote lijnen uit moet zien.

Ik kan alleen van ASP gebruikmaken, PHP is geen optie.

[ Voor 8% gewijzigd door CmdrKeen op 15-01-2003 14:02 ]

Bloed, zweet & koffie


  • Flard
  • Registratie: Februari 2001
  • Laatst online: 24-08 10:13
Ik heb het volgende gedaan op mijn site:

Op het moment dat een lid inlogt, verandert hij in de leden tabel ook het veld 'LastSeen' in de huidige datum + tijd .

In het vak 'Wie is online', laat hij dan gewoon de mensen zien waarbij de datum + tijd tussen nu en vijf minuten geleden ligt.


Misschien is het een idee voor je... Jij wil er namelijk ook nog de gasten (mensen die niet zijn ingelogd) erbij hebben staan...

  • CmdrKeen
  • Registratie: Augustus 2000
  • Laatst online: 27-05 21:11

CmdrKeen

Krentenboltosti

Topicstarter
Heeey dat is wel een idee! Ga ik eens uitproberen.. Tenks!

Bloed, zweet & koffie


  • Xion
  • Registratie: November 2000
  • Laatst online: 22:49
In je Global.asa:
code:
1
2
3
4
5
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnEnd
    'Prop hier al je code in om users uit je userlist te halen.
End Sub
</SCRIPT>


Global.asa hoort in je root te staan. ;)

  • CmdrKeen
  • Registratie: Augustus 2000
  • Laatst online: 27-05 21:11

CmdrKeen

Krentenboltosti

Topicstarter
Als ik dat spul in de Global.asa zet, moet ik daar dus een applicatievariabele maken en die aanroepen vanuit de app, zoiets van:
code:
1
2
3
4
5
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnEnd
    application("userlist") = replace(application("userlist"), session("user"), "")
End Sub
</SCRIPT>

(beetje kort door de bocht omdat je er ook nog de separators uit moet halen (komma's of pipes of zo), maar je begrijpt wat de bedoeling is.)

Maar ik dacht altijd dat je in je global.asa geen sessievariabelen kon aanroepen!

Bloed, zweet & koffie


  • Xion
  • Registratie: November 2000
  • Laatst online: 22:49
Vilenin schreef op 15 januari 2003 @ 14:49:
code:
1
2
3
4
5
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnEnd
    application("userlist") = replace(application("userlist"), session("user"), "")
End Sub
</SCRIPT>


Maar ik dacht altijd dat je in je global.asa geen sessievariabelen kon aanroepen!
Op deze manier mag het wel, in de "Sub Application_OnStart of OnEnd" mag het niet, lijkt me nogal logisch omdat deze Sub's worden uitgevoerd als de Applications start of stopt.

  • CmdrKeen
  • Registratie: Augustus 2000
  • Laatst online: 27-05 21:11

CmdrKeen

Krentenboltosti

Topicstarter
Kijk, das dan wel weer logisch. Ik dacht: anders ga ik er nooit achterkomen welke user zich nou precies afmeldt! :D

Bloed, zweet & koffie


  • Xion
  • Registratie: November 2000
  • Laatst online: 22:49
Vilenin schreef op 15 januari 2003 @ 15:06:
Kijk, das dan wel weer logisch. Ik dacht: anders ga ik er nooit achterkomen welke user zich nou precies afmeldt! :D
BTW, Session_OnEnd wordt uitgevoerd, als de server de sessie beeindigt! Dus check wel of een user er al uit is. (in een geval van replace hoeft dat niet, maar dan mag je userlist niet leeg zijn)

  • Mart!
  • Registratie: Februari 2000
  • Laatst online: 23-08 14:17
Denk er ook even aan je application-object even te locken voordat je er in gaat wijzigen.
ASP:
1
2
3
4
5
6
7
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">
Sub Session_OnEnd
    Application.Lock
    Application("userlist") = replace(application("userlist"), session("user"), "")
    Application.Unlock
End Sub
</SCRIPT>


Zie ook http://www.devguru.com/Te...ref/application_lock.html

  • CmdrKeen
  • Registratie: Augustus 2000
  • Laatst online: 27-05 21:11

CmdrKeen

Krentenboltosti

Topicstarter
Ik vind dat onderstaande code zou moeten werken, maar dat doet het niet :(
Als ik mijn linkje "End Session" klik, blijft de username gewoon staat. De usernames worden wel toegevoegd, maar niet meer verwijderd. Wat doe ik verkeerd?

Default.asp:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<% @Language = "VBScript" %>
<% Option Explicit %>
<% Response.Buffer = True %>
<% Response.Expires = -1 %>
<%
Dim user, act
act = request("act")
user = request("user")
session("user") = user

if act = "endses" then
    session.abandon
    response.redirect("default.asp")
end if

if session("user") <> "" then
    if application("namenlijst") <> "" then
        if InStr(application("namenlijst"), Session("user")) = 0 then
            application("namenlijst") = application("namenlijst") & "," & session("user")
            application("namenlijst") = replace(application("namenlijst"), ",,", ",")
            application("namenlijst") = trim(application("namenlijst"))
        end if
    else    
        application("namenlijst") = session("user")
    end if
end if


%>
<html>
    <body>
        
        <form method = post>
            <input type = text name = user>
            <input type = submit name = submit value = "Ok">
        </form>

        <a href = default.asp?act=endses>End session</a>
        
        <hr>
        <u>Variabelen:</u><br>
        <b>Application("namenlijst"):</b> [<%=application("namenlijst")%>]<br>
        <b>user:</b> [<%=user%>]<br>
        <b>Session("user"):</b> [<%=session("user")%>]<br>
        
    </body>
</html>


global.asa (staat in de root)
code:
1
2
3
4
5
6
7
8
9
10
<SCRIPT LANGUAGE="VBScript" RUNAT="Server">

Sub Session_OnEnd
    application.Lock
    application("namenlijst") = replace(application("namenlijst"), session("user"), "")
    application("namenlijst") = replace(application("namenlijst"), ",,", ",")
    application.Unlock
End Sub

</SCRIPT>


ff wat meer info: na timeout van de sessie wordt de user er wél uitgehaald.. de sub werkt dus *wel*, maar waarom reageert-ie niet op een session.abandon?

[ Voor 26% gewijzigd door CmdrKeen op 15-01-2003 16:11 ]

Bloed, zweet & koffie


  • risr
  • Registratie: Juli 2002
  • Laatst online: 14-07 10:19
Dit is een bekend probleem met MS ASP 3.0! <- negeer voorlopig maar :z

Gebruik zoiets als Flard voorstelde.

[ Voor 19% gewijzigd door risr op 15-01-2003 19:25 . Reden: later ]


  • nIghtorius
  • Registratie: Juli 2002
  • Laatst online: 21-08 16:50

nIghtorius

Poef!

heb ook zoiets geleden moeten oplossen (erachter komen wie op m'n site zaten)..
maar ipv een database te gebruiken. gebruik ik een volatile recordset (eentje die in het geheugen zit)

mijn global.asa

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<object runat="Server" scope="Application"
id="rstActiveUsers" progid="ADODB.Recordset">
</object>

<script language="VBScript" runat="Server">

'' Applicatie start afhandelen.. standaard waarden voor
'' elke sessie instellen. en creatie van onze "temp" recordset
'' gedefiniëerd als rstActiveUsers.

Sub Application_OnStart()
    '' ADODB constanten
    Const   adInteger = 3
    Const   adVarChar = 200
    Const   adDate = 7
    
    '' Creeër virtuele tabel (bestaat alleen in server geheugen).
    rstActiveUsers.Fields.Append "id", adInteger
    rstActiveUsers.Fields.Append "ip", adVarChar, 15
    rstActiveUsers.Fields.Append "browser", adVarChar, 255
    rstActiveUsers.Fields.Append "started", adDate
    rstActiveUsers.Fields.Append "username", adVarChar, 64
    
    rstActiveUsers.Open '' open recordset.      
End Sub

Sub Session_OnStart()
    Session.Timeout = 20    '' timeout sessie in 20 minuten
    Session("start") = Now()
    '' if Not rstActiveUsers.EOF then rstActiveUsers.MoveLast
    rstActiveUsers.AddNew
    rstActiveUsers.Fields("id").Value = Session.SessionID
    rstActiveUsers.Fields("ip").Value = Request.ServerVariables ("REMOTE_HOST")
    rstActiveUsers.Fields("browser").Value = Request.ServerVariables ("HTTP_USER_AGENT")
    rstActiveUsers.Fields("started").Value = Now()
    rstActiveUsers.Fields("username").Value= "Guest"
    rstActiveUsers.Update
    Session ("username") = "Guest"
End Sub

Sub Session_OnEnd()
    Const adSearchForward = 1
    Const adBookmarkFirst = 1
    Const adAffectCurrent = 1
    rstActiveUsers.Find "id = " & Session.SessionID, 0, adSearchForward, adBookmarkFirst
    if not rstActiveUsers.EOF then
        rstActiveUsers.Delete adAffectCurrent
    end if  
End Sub

Sub Application_OnEnd()
    rstActiveUsers.Close
End Sub

</script>

Ryzen 9 5900X @ 5.1Ghz | MPG B550 GAMING CARBON | 96GB DDR4-3200 | RTX 4070TI | 2TB + 1TB m.2 SSD | 3x 1TB HDD | 1x 2TB SATA SSD | 32" G3223Q (4K/144Hz)


  • CmdrKeen
  • Registratie: Augustus 2000
  • Laatst online: 27-05 21:11

CmdrKeen

Krentenboltosti

Topicstarter
De database-manier van Flard werkt goed, maar niet voor mijn site. Op sommige sites weet je ongeveer hoe lang de gemiddelde bezoeker er rondhangt, maar niet op deze site - je kan dus niet stellen dat iemand na vijf minuten weer off-line is, en om de gebruiker nou om de vijf minuten (automatisch) opnieuw in te laten loggen vind ik ook niet nodig als er alternatieven zijn. Toch vind ik het idee geniaal in zijn eenvoud.

De global.asa-manier heb ik toegepast. Ik heb het op de volgende manier opgelost:

* als de gebruiker zich aanmeldt, wordt zijn gebruikersnaam toegevoegd (als die niet al bestaat) aan application("namenlijst").
* als de gebruiker zich afmeldt, wordt in de applicatie zelf (dus niet in de global.asa) zijn naam verwijderd uit application("namenlijst")
* als de sessie van de gebruiker een time-out krijgt (gebruiker is weggegaan zonder af te melden), dan regelt global.asa dat de naam uit application("namenlijst") verwijderd wordt.

Wat is dat over een bekend probleem, Ramses?

...wat later...
Ik lees dat de global.asa in de root van de applicatie moet staan, en niet in de root van de w3-service! Zou dat misschien het probleem zijn? Lijkt me niet, want time-outs gaan gewoon goed...

[ Voor 12% gewijzigd door CmdrKeen op 16-01-2003 13:16 ]

Bloed, zweet & koffie

Pagina: 1