Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible for Rails sessions to be created 'just in time'?

My understanding of the session lifecycle in Ruby on Rails (specifically v3 and upwards) is that a session is created at the start of a request, for each and every request, and if that request doesn't carry an existing session cookie a new one will be created, otherwise the session cookie is deserialized and stored in the session hash.

The purpose of this, of course, supports a number of security features such as CSRF etc.

However, this poses a bit of an issue when it comes to caching of pages in a site with HTTP cache services and proxies such as Varnish, as most of the configurations tend to strip out these (generally all) cookies on both the request and response end (as the cache is usually intended for a generalized audience).

I know that it is possible to setup Varnish etc to create the object hash with the cookie details included, and this would scope the cached data to that session (and therefor that user), however I am wondering if this is completely necessary.

I have an application which is fairly 'static' in nature - content is pulled from a database, rendered into a page which can then be cached - there are a few elements (such as comment count, 'recent' items etc) which can be added in with an ESI, but for every request Rails still tends to want to setup a new session, and when a user already has a session this stuff is stripped out by the cache server.

I am wondering if it might be possible (via pre-existing functionality, or building the functionality myself) to allow the developer to control when a session is required, and only when that is specified is the back-and-forwards with cookies, session initialization/deserialization etc necessary.

That, or I am thinking about this problem the wrong way and need to address the issue from another angle...

like image 788
Matthew Savage Avatar asked Nov 09 '10 12:11

Matthew Savage


2 Answers

From what I know rails sessions can be controlled fairly in-depth via ActionController::SessionManagement

http://ap.rubyonrails.org/classes/ActionController/SessionManagement/ClassMethods.html#M000070

There are examples in the API docs of disabling it per action, per controller, etc.

like image 153
spivak Avatar answered Nov 12 '22 01:11

spivak


If your site is mostly static then you may want to use full page caching. This takes Rails out of the request entirely and let's the web server deal with it once the content has been generated. Might cause some serious headaches depending on your exact needs as far as the comment counts and user-specifics though.

like image 21
MDaubs Avatar answered Nov 12 '22 03:11

MDaubs