Persistent sessions

Ron Garret ron at flownet.com
Fri Feb 14 16:59:09 UTC 2014


On Feb 14, 2014, at 2:31 AM, peter <p2.edoc at gmail.com> wrote:

> I find that I have the same requirement and would like not to 
> re-invent wheels so would much appreciate hearing any insights you 
> gained rg.

Turns out to be very easy.  HT sessions can be accessed and set via the generic function ht:session-db, which returns an alist.  The alist keys are fixnums and the values are opaque HT::SESSION objects.  To make a persistent session all you have to do is serialize and restore this alist.  All of the slots of an HT::SESSION are atoms, except for HT::SESSION-DATA, which is an alist, but it contains only values that you put there.  So serializing an HT::SESSION is not hard.

The challenging part for me turned out to be restoring Hunchentoot’s internal session state on restart, because HT assumes that there is an active request whenever a session is created:

? (make-instance 'ht::session)
> Error: Unbound variable: *REQUEST*

So you have to restore sessions using ALLOCATE-INSTANCE instead of MAKE-INSTANCE.  Other than that it is completely straightforward.  (I ended up writing a little general-purpose object serializer using the MOP.)

> For local hosting, I used a persistent global session-ID counter as a 
> patch (ensuring session-IDs can't overlap, but that's not acceptable 
> for cloud hosting.
> All I need really is persistence of the client's cookie validity, as 
> all state data I keep outside HT.

Not sure I understand this.  HT natively provides unique (per server) session id’s.  If you want to make session id’s unique across multiple servers that is a different problem than making sessions persistent.  But HT already has a hook for that: the generic function NEXT-SESSION-ID.  Is there a reason that doesn’t work for you?

rg

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 455 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <https://mailman.common-lisp.net/pipermail/tbnl-devel/attachments/20140214/6bd64494/attachment.sig>


More information about the Tbnl-devel mailing list