Listing 1

<cfapplication name="MyApp" sessionmanagement="Yes">

<cflock scope="session" timeout="20" type="exclusive">
<cfparam name="Session.Data" default="#StructNew()#">
<cfset Request.Session = Duplicate(Session.Data)>
</cflock>
<cflock scope="application" timeout="20" type="exclusive">
<cfparam name="Application.Data" default="#structNew()#">
<cfset Request.Application = Duplicate(Application.Data)>
</cflock>
<cflock scope="server" timeout="20" type="exclusive">
<cfparam name="Server.Data" default="#structNew()#">
<cfset Request.Server = Duplicate(Server.Data)>
</cflock>

Listing 2

<cflock scope="session" timeout="20" type="exclusive">
<cfset Session.Data = Duplicate(Request.Session)>
</cflock>
<cflock scope="application" timeout="20" type="exclusive">
<cfset Application.Data = Duplicate(Request.Application)>
</cflock>
<cflock scope="server" timeout="20" type="exclusive">
<cfset Server.Data = Duplicate(Request.Server)>
</cflock>

Listing 3

<cflock scope="session" timeout="20" type="exclusive">
<cfset Session.Data.loggedin = 1>
</cflock>
<cflocation url="../index.cfm">

Listing 4

<!--- Create a custom tag, TrackUsers.cfm, to store information about each user --->

<cflock timeout="30" throwontimeout="No" type="EXCLUSIVE" scope="SERVER">
<cfif (not isDefined("Server.qUsers")) OR (NOT IsQuery(Server.qUsers))>
<cfscript>
Server.qUsers = QueryNew("User,AppName,RequestTime");
QueryAddRow(Server.qUsers);
QuerySetCell(Server.qUsers,"User",Attributes.User);
QuerySetCell(Server.qUsers,"AppName",Attributes.AppName);
QuerySetCell(Server.qUsers,"RequestTime",CreateODBCTime(now()));
</cfscript>
<cfelse>
<cfquery name="qMaxReq" dbtype="query">
select max(requesttime) as lastreq, Count(User) AS RowCount
from Server.qusers
</cfquery>
<cfset ElapsedTime = CreateODBCTime(now()) - qMaxReq.LastReq>
<cfif (TimeFormat(Variables.ElapsedTime,'m') gt 15) OR (qMaxReq.RowCount gt 350)>
<cfscript>
Server.qUsers = "";
Server.qUsers = QueryNew("User,AppName,RequestTime");
</cfscript>
</cfif>
<cfscript>
QueryAddRow(Server.qUsers);
QuerySetCell(Server.qUsers,"User",Attributes.User);
QuerySetCell(Server.qUsers,"AppName",Attributes.AppName);
QuerySetCell(Server.qUsers,"RequestTime",CreateODBCTime(now()));
</cfscript>
</cfif>
</cflock>

<CF_TrackUsers User="#cgi.remote_addr#" AppName="MyApp">

<!--- Create a report page, Active_User_Report.cfm, to display data --->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

Select UserIP, AppName, Max(RequestTime) as LastReq, Count(User)
as Hits From server.qUsers Group by user, AppName Order by LastReq desc