1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
require 'action_dispatch/middleware/session/abstract_store'
module ActionDispatch
module Session
# A session store that uses an ActiveSupport::Cache::Store to store the sessions. This store is most useful
# if you don't store critical data in your sessions and you don't need them to live for extended periods
# of time.
#
# ==== Options
# * <tt>cache</tt> - The cache to use. If it is not specified, <tt>Rails.cache</tt> will be used.
# * <tt>expire_after</tt> - The length of time a session will be stored before automatically expiring.
# By default, the <tt>:expires_in</tt> option of the cache is used.
class CacheStore < AbstractStore
def initialize(app, options = {})
@cache = options[:cache] || Rails.cache
options[:expire_after] ||= @cache.options[:expires_in]
super
end
# Get a session from the cache.
def find_session(env, sid)
unless sid and session = @cache.read(cache_key(sid))
sid, session = generate_sid, {}
end
[sid, session]
end
# Set a session in the cache.
def write_session(env, sid, session, options)
key = cache_key(sid)
if session
@cache.write(key, session, :expires_in => options[:expire_after])
else
@cache.delete(key)
end
sid
end
# Remove a session from the cache.
def delete_session(env, sid, options)
@cache.delete(cache_key(sid))
generate_sid
end
private
# Turn the session id into a cache key.
def cache_key(sid)
"_session_id:#{sid}"
end
end
end
end
|