tobbo has asked for the wisdom of the Perl Monks concerning the following question:

Hello,

I'm using Catalyst::Plugin::Session in my webapp.Now want to use Javascript to regulary poll data fro it, however this automatically resets the session expiration time. Is there a way to keep the previous session expiration time when requesting certain actions?

  • Comment on Stop Catalyst::Plugin::Session from autoextending sessions for certain requests

Replies are listed 'Best First'.
Re: Stop Catalyst::Plugin::Session from autoextending sessions for certain requests
by Your Mother (Archbishop) on Nov 15, 2017 at 21:34 UTC

    This is a really good question. I feel like there should be a best practice for it but I don't have one. Here is a handful of suggestions.

    • Use a different cookie for the JS.
    • Don't send a cookie at all with the JS if the data isn't user protected.
    • You need finer grained control so manage session experition expiration yourself in session values/attributes and hook after "finalize" or along that line-
    • Write a Session Plugin subclass and use finalize_session. I've done this one. Don't have time, right now, to part it out to something simple for you.
    • Emulate "logout" by clearing the user from the session triggered by resetting a user key expiration on all non-Ajax pages (that one is simple enough to hack out below).
    • Maybe one or two I've not considered.

    Emulate logout by clearing user from $c->session

    If your have your view classes divided properly, this version should be easy. Just put it in your non-Ajax/JSON view class's end. I include Catalyst::Action::RenderView despite the simplistic example as I consider it a best practice and it enables app (or view at least) wide error handling.

    sub render : ActionClass("RenderView") {} sub end : Private { my ( $self, $c ) = @_; $c->session_expire_key( __user => 3600 ); # "Expiration" is now 1 +hour. $c->forward("render"); }

    Possible variation, untested, might need browser specific tweaks. :(

    $c->session_expire_key( __user => 3600 ) unless $c->req->header("X-Requested-With") eq "XMLHttpRequest";

    See also, Catalyst::Manual::Cookbook.

Re: Stop Catalyst::Plugin::Session from autoextending sessions for certain requests
by Anonymous Monk on Nov 16, 2017 at 15:21 UTC
    One cheap-trick that I once used was to store an expiration time-stamp in the session data. My software then checked this stored value, and updated it manually as needed. You could use the same approach to determine whether the session-data should still be honored by the application, and thus not be concerned about whether Catalyst is extending it. (In fact, you would want Catalyst to be extending it, so that you continued to have access to the stored expire-time value.) Yeah, it's a cheap trick, but it should work just fine.