Listing 1

<!--- Application.cfm--->
<cfapplication name="myApp" clientmanagement="Yes"
 clientstorage="testDB"
 sessionmanagement="Yes"
 sessiontimeout="#CreateTimeSpan(0, 0, 15, 0)#">
<cfset request.datasource = "TestDB";

<!--- Default customization settings --->
<cfparam name="client.email" default="">
<cfparam name="client.fname" default="">
<cfparam name="client.lname" default="">
<cfparam name="client.bgColor"
 default="##ffffff">
<cfparam name="client.fontColor"
 default="##000000">
<cfparam name="client.fontFamily" default="Arial,
 Helvetica, sans-serif;">
<cfparam name="client.heroSort" default="lname">

<cflock scope="session" type="readonly" timeout="5">
 <cfif isDefined("session.isLoggedIn")>
  <cfset request.isLoggedIn = "y"
 <cfelse>
  <cfset request.isLoggedIn = "n">
 </cfif>
</cflock>

Listing 2

create table Users
(
    email        nvarchar(40)          not null,
    password     nvarchar(20)          not null,
    fname        nvarchar(50)          not null,
    lname        nvarchar(50)          not null,
    subscribe    int                   null    ,
    telephone    nvarchar(14)          null    ,
    extension    nvarchar(10)          null    ,
    preferences  ntext                 null    ,
    constraint PK_Users primary key clustered (email)
)

Listing 3

<!--- login.cfm (excerpt) --->
<cfquery name="exists"
 datasource="#request.datasource#" maxrows="1">
 select email, fname, lname 
 from Users 
 where email = '#trim(form.email)#' and 
       password = '#trim(form.password)#'
</cfquery>
<cfif exists.RecordCount> 
 <!--- Successful login --->
 <cfset client.fname = exists.fname>
 <cfset client.lname = exists.lname>
 <cflock scope="session" type="exclusive"
  timeout="5">
  <cfset session.isLoggedIn = "y">
  <cfset request.isLoggedIn = "y">
 </cflock>
 <cfinclude template="retrieveClientVars.cfm">
</cfif>

Listing 4

<!--- retrieveClientVars.cfm --->

<cfquery name="retrievePrefs"
 datasource="#request.datasource#">
 select preferences from Users
 where email = '#trim(client.email)#'
</cfquery>

<cfif retrievePrefs.Recordcount and
      retrievePrefs.preferences NEQ "">
 <cfwddx action="wddx2cfml"
  input="#retrievePrefs.preferences#"
  output="variables.prefStruct">
 <cfloop collection="#variables.prefStruct#"
         item="clientVar">
  <cfset "client.#clientvar#" =
   StructFind(Variables.prefStruct, clientVar)>
 </cfloop>
</cfif>

Listing 5

<!--- setCustomizations.cfm --->
<!---
      This template must be included on EVERY
      page that sets client variables or else 
      included in OnRequestEnd.cfm to ensure 
      that all client variable changes are saved 
--->
<cfset variables.prefStruct = StructNew()>
<cfloop list="#GetClientVariablesList()#"
        index="i">
 <cfset tmp = StructInsert(variables.prefStruct,
        "#i#", "#evaluate(i)#", true)>
</cfloop>

<cfwddx action="cfml2wddx"
        input="#variables.prefStruct#"
        output="variables.prefWDDX">

<cfquery name="updatePrefs"
 datasource="#request.datasource#">
 update Users
 set preferences = '#trim(variables.prefWDDX)#'
 where email = '#trim(client.email)#'
</cfquery>

Additional Code for this Article zip file ~1,816 KB