'Manage session creation timestamp in Lift' post illustration

Manage session creation timestamp in Lift

avatar

Lift framework lacks the ability to fetch a session creation timestamp by default. This post will provide a short example of how one can do this while working with Lift.

Note: This example uses org.joda.time.DateTime class for working with date.

Lift provides an ability to customize a session creation flow by injecting a function into the LiftRules.sessionCreator configuration value during the application bootstrapping. It is a function which accepts an HTTPSession and a String with an application context path wrapped in a LiftSession. And that's where a session creation timestamp value can be added to the session:

bootstrap.liftweb.Boot
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import net.liftweb.common._
import net.liftweb.http._
import org.joda.time.DateTime

class Boot {

  def boot {
    LiftRules.sessionCreator = {
      case (httpSession, contextPath) =>
        // set the "creation_timestamp" session attribute as the current date/time
        httpSession.setAttribute("creation_timestamp", new DateTime())

        // create a new LiftSession based on the HTTPSession and the application context
        new LiftSession(contextPath, httpSession.sessionId, Full(httpSession))
    }

    ...
  }
}

The following code can be used to extract a creation timestamp from the Lift session:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import net.liftweb.common._
import net.liftweb.http._
import net.liftweb.util.Helpers
import org.joda.time.DateTime

...

val sessionCreationTimestamp: Box[DateTime] = for {
  liftSession <- S.session
  httpSession <- liftSession.httpSession
  timestamp <- Helpers.tryo {
    // a value of the "creation_timestamp" session attribute is extracted here
    httpSession.attribute("creation_timestamp").asInstanceOf[DateTime]
  }
} yield timestamp

...

Here we are extracting the LiftSession. Then retrieving an underlying instance of the HTTPSession to be able to extract a value of the session scope attribute by its name. The latter is done by calling the attribute(key: String) method of the HTTPSession.

The value of an attribute will be returned as an instance of scala's Any. Then it can be casted to the actual type using the asInstanceOf[T] method. The T type parameter should be set with the desired result type. In case the specified type mismatches the actual type of a value, a java.lang.ClassCastException will be thrown.

Hope you find this tip helpful.

If you're looking for a developer or considering starting a new project,
we are always ready to help!