8 Replies Latest reply on Sep 13, 2016 11:10 AM by BKBK

    Detecting end of session with JS

    marcb301158

      Hello,

       

      i'm using CF11,

       

      part of my application.cfm file :

       

      <cfapplication name="myapp" clientmanagement="yes" sessionmanagement="yes" sessiontimeout="#createtimespan(0,0,30,0)#">

      When the user is logged in, session variable session.validlog is set to 1

       

      The JS script (loaded with index.cfm) :

       

      <script type="text/javascript">

        function session_checking()

        {

           $.post("ajax-session.cfm", function(data) {

               if(data === "-1")

               {

                   window.location = "http:/myserver/login.cfm";

               }

               else

                {

                console.log('Session active') ;

               }

           });

        }

        var validateSession = setInterval(session_checking, 5000);

        </script>

       

      the ajax-session.cfm file :

       

      <cfswitch expression="#session.validlog#" >

        <cfcase value="1">1</cfcase>

        <cfdefaultcase>0</cfdefaultcase>

      </cfswitch>

       

      So : every 5 sec ajax-session.cfm is executed, if it return -1, user is redirected to the login page.

       

      Issue :

      When application session timeout is coming to 0, the user is not redirected to the login page ...

      Any idea ?

       

      Thanks,

       

      Marc

        • 1. Re: Detecting end of session with JS
          WolfShade Level 4

          Kind of a clever combining of CF and JS.  Very nice.

           

          However, you're expecting -1 if the session is gone, but your defaultcase is returning 0, not -1.

           

          Why not just return the #session.validlog# value instead of using a switch/case?  It's just returning a hardcoded version of #session.validlog#, anyway.

           

          V/r,

           

          ^_^

          1 person found this helpful
          • 2. Re: Detecting end of session with JS
            BKBK Adobe Community Professional & MVP

            marcb301158 wrote:

             

            When the user is logged in, session variable session.validlog is set to 1

            To repeat WolfShade's point, what is the value of session.validlog when the user is not logged in, 0 or -1?

             

            if(data === "-1")

            {

            window.location = "http:/myserver/login.cfm";

            }

            ...

            ...

             

            <cfswitch expression="#session.validlog#" >

            <cfcase value="1">1</cfcase>

            <cfdefaultcase>0</cfdefaultcase>

            </cfswitch>

             

            Use

            session.validlog = -1 or 1

            if(data == -1)

            <cfdefaultcase>-1</cfdefaultcase>

             

            or

             

            session.validlog = 0 or 1

            if(data == 0)

            <cfdefaultcase>0</cfdefaultcase>

            • 3. Re: Detecting end of session with JS
              marcb301158 Level 1

              @Wolfshade :

               

              Modifying ajax-session.cfm with #session.validlog#

              When session ended, nothing happend, no return to login page.

              In the console i see the output looping with the value of #session.validlog#.

              It seems that the session never end.

              When i comment the script, session ended as well.

              Wierd ...

               

              @BKB : answer in the above response session.log value is always 1 (session active) even if session timeout is out ...

              • 4. Re: Detecting end of session with JS
                WolfShade Level 4

                Running the script every five seconds is "polling", and (dare I say it) totally unnecessary.  Since the application.cfc/.cfm is run prior to every page load, you can set a conditional (if/else or switch/case, I prefer the latter) in your onRequestStart() that checks for session.

                 

                However, the conditional will loop eternally unless part of the conditional takes the current page into account.  So instead of JUST doing "if this session variable doesn't exist, redirect to login page", you need to "if this session variable doesn't exist AND if this page isn't login.cfm, redirect to login.cfm".  That way, if the redirect goes to login.cfm, application.cfc/.cfm doesn't keep redirecting endlessly.

                 

                HTH,

                 

                ^_^

                • 5. Re: Detecting end of session with JS
                  BKBK Adobe Community Professional & MVP

                  marcb301158 wrote:

                   

                  @BKB : answer in the above response session.log value is always 1 (session active) even if session timeout is out ...

                  Then Application.cfc is much better for you than Application.cfm. Something like this:

                   

                  Application.cfc

                  <cfcomponent displayname="Application file">

                      <cfscript>

                          this.name = "myapp";

                          this.applicationTimeout = "#createTimespan(2,0,0,0)#";

                          this.clientManagement = "true";

                          this.sessionManagement = "true";

                          this.sessionTimeout = "#createTimeSpan(0,0,30,0)#";

                          this.scriptProtect = "all";

                      </cfscript>

                     

                      <cffunction name="onSessionStart">

                          <cfset session.validlog = -1>

                      </cffunction>

                   

                      <cffunction name="onSessionEnd">

                         <cfargument name = "SessionScope" required="true">

                         <cfargument name = "AppScope" required="true">

                   

                            <cfset session.validlog = -1>

                      </cffunction>

                  </cfcomponent>

                  -------------------------------------------------

                  login.cfm

                  <!--- Validate login credentials --->

                  <cfif isLoginValid>

                  <cfset session.validlog = 1>

                  </cfif>

                  • 6. Re: Detecting end of session with JS
                    marcb301158 Level 1

                    Hello,

                     

                    Thanks for the answers.

                     

                    From where is "isLoginValid" coming from ? Is it a CF function ?

                     

                    In my Application.cfm file i've something like this :

                     

                    How can i insert these param in the cfc file ?

                     

                     

                    <cfset application.vmware = "#CGI.SERVER_NAME#">

                     

                    <cfset application.mailStb = stb@mail.com">

                    <cfset oldlocale = SetLocale("French (Belgian)")>

                     

                    <cfswitch expression="#application.vmware#" >

                    <cfcase value="DevServer">

                    <cfset TableMvt = "[CF].[dbo].[HOLT_MOUVEMENTS_WORK]" >

                    <cfset TableEqt = "[CF].[dbo].[HOLT_EQUIPEMENTS_WORK]" >

                    <cfset VueGlobale = "[CF].[dbo].[VW_HOLTERS_GLOBAL_WORK]" >

                    <cfset EnvDev = TRUE >

                    </cfcase>

                    <cfcase value="ProdServer">

                    <cfset TableMvt = "[CF].[dbo].[HOLT_MOUVEMENTS]" >

                    <cfset TableEqt = "[CF].[dbo].[HOLT_EQUIPEMENTS]" >

                    <cfset VueGlobale = "[CF].[dbo].[VW_HOLTERS_GLOBAL]" >

                    <cfset EnvDev = FALSE >

                    </cfcase>

                    </cfswitch>

                     

                    Thx

                     

                    Marc

                     

                    • 7. Re: Detecting end of session with JS
                      WolfShade Level 4

                      Marc,

                       

                      First, I would be remiss if I failed to mention that application.cfm is the old school approach to ColdFusion, and should be replaced with application.cfc, as the cfc is more modern, easier to work with, and you can set up all kinds of things with it.

                       

                      But back to your most recent question.  It can be placed almost anywhere within your application.cfm, but would probably be best right after the last line of code you provided, after the CFSWITCH.  It won't be using JavaScript to detect end of session, per your original request, however it would be the best practice for checking end of session.

                       

                      V/r,

                       

                      ^_^

                      • 8. Re: Detecting end of session with JS
                        BKBK Adobe Community Professional & MVP

                        marcb301158 wrote:

                         

                        From where is "isLoginValid" coming from ?

                         

                        IsLoginValid is simply a boolean variable. (I expected you to recognize it by its name and to translate it according to your own context.) It holds the result of the validation of the user's credentials. If username and password are valid, then isLoginValid true, else false.

                         

                        The variables seem to me to have scopes as shown below. I don't expect you to change servers or locale once the application has started.

                         

                        Application:

                        vmware

                        mailStb

                        oldlocale

                        tableMvt

                        TableEqt

                        vueGlobale

                        envDev

                         

                        Session:

                        validlog

                        isLoginValid (or your own equivalent variable)

                         

                        You could then have

                         

                        Application.cfc

                         

                        <cfcomponent displayname="Application file">

                         

                        <cfscript>

                        this.name = "myapp";

                        this.applicationTimeout = "#createTimespan(2,0,0,0)#";

                        this.clientManagement = "true";

                        this.sessionManagement = "true";

                        this.sessionTimeout = "#createTimeSpan(0,0,30,0)#";

                        this.scriptProtect = "all";

                        </cfscript>

                         

                        <cffunction name="onApplicationStart" returntype="boolean">

                        <cfset application.vmware = CGI.SERVER_NAME>

                        <cfset application.mailStb = "stb@mail.com">

                        <cfset application.oldlocale = setLocale("French (Belgian)")>

                        <cfswitch expression="#application.vmware#" >

                            <cfcase value="DevServer">

                                <cfset application.tableMvt = "[CF].[dbo].[HOLT_MOUVEMENTS_WORK]" >

                                <cfset application.tableEqt = "[CF].[dbo].[HOLT_EQUIPEMENTS_WORK]" >

                                <cfset application.vueGlobale = "[CF].[dbo].[VW_HOLTERS_GLOBAL_WORK]" >

                                <cfset application.envDev = TRUE >

                            </cfcase>

                            <cfcase value="ProdServer">

                                <cfset application.tableMvt = "[CF].[dbo].[HOLT_MOUVEMENTS]" >

                                <cfset application.tableEqt = "[CF].[dbo].[HOLT_EQUIPEMENTS]" >

                                <cfset application.vueGlobale = "[CF].[dbo].[VW_HOLTERS_GLOBAL]" >

                                <cfset application.envDev = FALSE >

                            </cfcase>

                        </cfswitch>

                        <cfreturn true>

                        </cffunction>

                         

                        <cffunction name="onSessionStart">

                        <cfset session.validlog = -1>

                        </cffunction>

                         

                        <cffunction name="onSessionEnd">

                        <cfargument name = "SessionScope" required="true">

                        <cfargument name = "AppScope" required="true">

                        <cfset session.validlog = -1>

                        </cffunction>

                         

                        </cfcomponent>

                         

                        -------------------------------------------------

                         

                        login.cfm

                        <!--- Validate login credentials. isLoginValid is a boolean variable that is true if the login credentials are valid, false otherwise. --->

                        <cfif isLoginValid>

                        <cfset session.validlog = 1>

                        </cfif>