article

Active Sessions, Active Logins and Total Site Hits with ASP

Email
Submitted on: 1/6/2015 3:42:00 AM
By: SoftwareMaker (from psc cd)  
Level: Advanced
User Rating: By 9 Users
Compatibility: ASP (Active Server Pages), VbScript (browser/client side)
Views: 1792
 
     Active Sessions, Active Logins and Total Site Hits with ASP

 
				

Many websites use a tracking-component pasted on their homepage to keep track on the no. of visits to their website. This method is not accurate as it doesnt really keep track of the genuine page-hits to their site (not that it really matters...). Everytime the page where the component is refreshed, the counter is incremented even though the user is the same and if a link takes you to some other page other than the page where this component is pasted, the tracker device will lose count of this hit. Sure you can paste this tracker component on every page on your site, but that would be highly cumbersome, inefficient and inaccurate as that would be lots of double-counting. You also cannot keep track of the active sessions on your site which means the number of visitors to your site at any moment. Morever, once you update your page, or when the server shuts-down for maintenance, you lose all data and history of your hit counts.

I am sure there are components out there who can do the job but it all depends on the price and whether your remote web administrator allows you to install these components on your virtual server (sharing the server with many websites).

There is a simple and free way to do what is described above via Microsoft Active Server Pages (ASP) which is widely used and implemented and free. Most websites, whether they are running IIS or Apache supports ASP.

All you need to do is to upload this script on this page to your server and you will be able to see a fairly accurate count of hits on your site, not just the page alone.

The scripts provided below MUST be pasted on a text-based file called GLOBAL.ASA. This file is always read by the server first whenever a browser requests HTTP content from the web server and its therefore accurate as any pages requested by the server will go through the GLOBAL.ASA file first.

The GLOBAL.ASA file is a fairly narrow topic but I will only highlight the 4 events that the GLOBAL.ASA file implements. You can also declare application-wide objects and variables on this file but we will only focus on keeping track of site-hits here.

Many websites use a tracking-component pasted on their homepage to keep track on the no. of visits to their website. This method is not accurate as it doesnt really keep track of the genuine page-hits to their site (not that it really matters...). Everytime the page where the component is refreshed, the counter is incremented even though the user is the same and if a link takes you to some other page other than the page where this component is pasted, the tracker device will lose count of this hit. Sure you can paste this tracker component on every page on your site, but that would be highly cumbersome, inefficient and inaccurate as that would be lots of double-counting. You also cannot keep track of the active sessions on your site which means the number of visitors to your site at any moment. Morever, once you update your page, or when the server shuts-down for maintenance, you lose all data and history of your hit counts.

I am sure there are components out there who can do the job but it all depends on the price and whether your remote web administrator allows you to install these components on your virtual server (sharing the server with many websites).

There is a simple and free way to do what is described above via Microsoft Active Server Pages (ASP) which is widely used and implemented and free. Most websites, whether they are running IIS or Apache supports ASP.

All you need to do is to upload this script on this page to your server and you will be able to see a fairly accurate count of hits on your site, not just the page alone.

The scripts provided below MUST be pasted on a text-based file called GLOBAL.ASA. This file is always read by the server first whenever a browser requests HTTP content from the web server and its therefore accurate as any pages requested by the server will go through the GLOBAL.ASA file first.

The GLOBAL.ASA file is a fairly narrow topic but I will only highlight the 4 events that the GLOBAL.ASA file implements. You can also declare application-wide objects and variables on this file but we will only focus on keeping track of site-hits here.

The events that the GLOBAL.ASA file implements corresponds to the Application and Session Object. They are namely Application_OnStart, Session_OnStart, Session_OnEnd and Application_OnEnd. They are all run in that order.

Application objects are used throughout the application regardless of the users and is started when the web-server starts and ends when the web-server shuts down (or when you copy a newer version of the GLOBAL.ASA file onto it). Session objects, on the other hand, are used per browser session. This means that a new browser, regardless of where it comes from, instantiates a new session. Session objects are cleared and re-initialized when the session times out which in most cases is 10 minutes.

Once you understand the basic concepts of Application and Session objects, you are ready to do wonders with your web application which traditionally takes a lot more coding and programming than your basic standalone ones as the HTTP protocols web applications run on are basically stateless (dont remember anything once they are run).

Lets get our hands dirty by understanding and writing some codes. Because, a Session is instantiated whenever a new browser requests content, a page hit should always be incremented here. To provide for data-persistence when a server shuts down, we will attempt to keep an application count (used throughout the application until the server shuts down) and then write that application count to a text file or a database to keep a "Hard-Copy" record of the total number of site-hits.

Sub Session_OnStart()
Dim TotalVisits
Application.Lock

Application("aHitCounter") is the application variable for keeping track of total number of site-hits
Application("aActiveSess") is the application variable for keeping the number of active sessions of your site the current moment.
In case this Application variable to keep track of active sessions doesnt exists, initialize it to 0

If IsEmpty(Application("aActiveSess")) Then
Application("aActiveSess") = 0
End If

Read from a stored Text File or a Database that keeps a record of the total no. of site hits.
(We wont cover this topic here) and save the result to a variable called TotalVisits
Increment TotalVisits by 1

TotalVisits = Clng(TotalVisits) + 1

Save this TotalVisits Variable to the Application("aHitCounter") variable
This application variable can then be used throughout the application, regardless of the number of sessions

Application("aHitCounter") = TotalVisits

Write Back to the same stored Text File or Database that keeps a record of the total no. of site hits the incremented value of the total number of Hits
To Increment the Active Session Count Whenever a New Session Starts

Application("aActiveSess") = Application("aActiveSess") + 1
Application.UnLock
End Sub

After a new user requests any pages from your site, this GLOBAL.ASA file will always run with the this event above. After that, throughout the application, we can access the total number of hits and the active sessions through the Application("aHitCounter") variable and Application("aActiveSess") variable respectively.
Now, we have to take care of the Application("aActiveSess") to make sure that this counter is decremented properly when the user session ends or times out. This is done via the Session_OnEnd Event

Decrement the Active Session Count After Session Ends

Sub Session_OnEnd

Application.Lock
Application("aActiveSess") = Application("aActiveSess") - 1
Application.UnLock

End Sub

Thats all. When the user session ends or times out, the above event will run and this application("aActiveSess") will be decremented accordingly to better reflect the number of ACTIVE sessions on you site.
After reading above Part one of this article and understanding the concept of Application and Session objects, I will dwell into keeping track of active Logins on your site. This is slightly trickier as we have to take into account that not every user that surfs your site will Login and not every Login user will manually terminate their Login session by logging out.
To achieve the above objectives, we will make use of two flag variables called Application("aflgLogin") and Session("sflgLogin") that keeps track of whether the user has logged out manually or the session terminated naturally.
If you have a Login page running on ASP, chances are that you will be verifying the username and password passed with the values stored in a database. Once that is verified, you would most likely assign Session variables to the Login user to keep track of his username, etc. All we need to add after the user is verified is to add these 2 lines of code once the user is verified.

'ON THE LOGIN PAGE
Session("sflgLogin") = True 'Session Flag Variable
Application("aLogins") = Application("aLogins") + 1

From there, we know the number of Active Logins by retrieving the value of Application("aLogins") variable and write it to an ASP page.

On the logout page if the user wants to manually logout, we implement these lines behind the ASP Logout page

'ON THE LOGOUT PAGE, Decrement the Active Logins accordingly
If Session("sblnLogin") = True then 'Utilize the Session Flag Variable
Application("aLogins") = Application("aLogins") - 1

'For Safety measures that the Active Logins cannot fall below ZERO

If Application("aLogins") <= 0 then
Application("aLogins") = 0
End If
Session("sblnLogin") = False
Application.Lock

A application Flag variable to be passed to Session_OnEnd when Session.Abandon is called next
Reason why we pass to an Application Flag Variable is because the Session.Abandon method clears all Session variables and runs the Session_OnEnd event of the GLOBAL.ASA file.
We need to keep track of whether the user has logged out manually or if the session has timed out naturally and we therefore need to keep track of this Application Flag Variable.

Application("ablnLogin") = False
Application.Unlock
End If
Session.Abandon

On the GLOBAL.ASA file, we need to add these lines in the following events

Sub Session_OnStart

'In case this Application variable to keep track of active Logins doesnt exists, initialize it to 0

If IsEmpty(Application("aLogins")) Then
Application("aLogins") = 0
End If
End Sub
Sub Session_OnEnd
Application.Lock

Application("aflgLogin") = False means User has Destroyed Session, therefore Reset Application("aflgLogin") then Exit Sub
No need to Decrement Application("aLogins") anymore as it had been done so at LogOut ASP Page

If Application("aflgLogin") = False then
Application("aflgLogin") = ""
Application.Unlock
Exit Sub
End If

If Program flowed into here, it means that Application("aflgLogin") is not False which means that the session
terminated naturally, therefore Decrement Application("aLogins") here.

Application("aLogins") = Application("aLogins") - 1

'For Safety measures that the Active Logins cannot fall below ZERO

If Application("aLogins") <= 0 then
Application("aiLogins") = 0
End If
Application.Unlock
End Sub

These are just my way of implementing a counter to keep track of Active Logins on my site. It may not be the most efficient method around so if any of you fellow developers have a better way to implement this, please do not hesistate to email me (itnews@Softwaremaker.Net) and let me know.


My website http://www.Softwaremaker.Net has an implementation of this script. Try it out by refreshing my homepage rightaway, then refreshing it after 10 minutes when your session times out or try to open up a new browser window to start a new session to see the active sessions and the number of site hits increment then wait for it to time out and watch the active session count decrement. There is also a counter to keep track the number of active Logins at the current moment so try loggin in and watch the active Login Counter increment and then do two different logouts to see the Active Login Counter decrement, one by manually terminating the session by clicking the Logout button and the other by waiting for the session to end after 10 minutes.

As you can see, once you understand the concept of the Application and the Session Object, we can easily manipulate the variables accordingly to what we want. But be careful, the perfect software engineering concept is often a Holy Grail at best. Overuse of the Application object can have undesirable effects on your web application as it will be harder to keep track of what each application variable is storing. It will also result in slower loading and memory leakage if unused application objects are not cleared properly. (Enter ASP.NET and the Garbage Collector to solve these problems...) The GLOBAL.ASA file has its own quirks too. Each time the web server is shut down, the GLOBAL.ASA file has to be re-copied back up to its remote location or your site will fail to initialize. But these are topics to be discussed on another day in another forum. Enjoy.


Report Bad Submission
Use this form to tell us if this entry should be deleted (i.e contains no code, is a virus, etc.).
This submission should be removed because:

Your Vote

What do you think of this article (in the Advanced category)?
(The article with your highest vote will win this month's coding contest!)
Excellent  Good  Average  Below Average  Poor (See voting log ...)
 

Other User Comments

10/15/2015 6:20:53 AMs n gawde

good
(If this comment was disrespectful, please report it.)

 

Add Your Feedback
Your feedback will be posted below and an email sent to the author. Please remember that the author was kind enough to share this with you, so any criticisms must be stated politely, or they will be deleted. (For feedback not related to this particular article, please click here instead.)
 

To post feedback, first please login.