Search code examples
javajspsession-timeoutshiro

how to show session is about to timeout dialog before 1 min in jsp?


I am trying to show session is about to timeout dialog in my shiro based application here is my code what i tried but its not working yet...

   <%
        Subject user = SecurityUtils.getSubject();
        Session usersession = user.getSession(true);
        if(user.isAuthenticated()){

                    Date startTime = usersession.getStartTimestamp(); //login time
                    Date lastAccessTime = usersession.getLastAccessTime(); //last active time
                    Date currentTime = new Date(); // current time
                    long diffInSec = (currentTime.getTime()- lastAccessTime.getTime())/1000 ; // calculate idle time of user
                    long timeout = (long)(usersession.getTimeout()* 0.001); // get sessiontime out in seconds
                    long oneMinleft = timeout - 60 ; // get time to show timeout dialog before 1 min of session timeout
                    System.out.println("startTime :"+startTime);
                    System.out.println("lastAccessTime :"+lastAccessTime);
                    System.out.println("currentTime :"+currentTime);
                    System.out.println("diffInSec :"+diffInSec);
                    System.out.println("Timeout:"+timeout);
                    System.out.println("Seconds left to timeout:"+oneMinleft);
                    System.out.println();

                        if(diffInSec >= oneMinleft){ %>
                          <script type="text/javascript">                                
                                    showTimeout(); // show dialog
                          </script>
                       <% 
                        }
        }

    %>

Any help is appreciated

Thanks & regards


Solution

  • Your problem is that you are doing that in JSP, so it is executed when the user is making a request so it is not idle and the session-timeout restarts. You may do something similar in javascript so the time runs when the user is doing nothing.

    You can mix JSP and javascript this way:

    setTimeout(function(){showTimeout()},<%= session.getMaxInactiveInterval() - 60*1000 %>);
    

    You don't need lastAccessTime since you know it always be 0 when attending a request.