redison download
conf/context.xml
<Context sessionCookiePath="/">
...
<Manager className="org.redisson.tomcat.RedissonSessionManager"
configPath="${catalina.base}/conf/redisson.yaml"
readMode="REDIS" />
</Context>
conf/redisson.yaml
singleServerConfig:
address: "redis://<host>:6379"
sessionCookiePath="/"
makes Tomcat use the same session id for different web apps.
RedissonSessionManager
makes session to be persisted in 'shared space'
I was not able to achieve desired result with org.apache.catalina.session.FileStore
PersistentManager
in shared context.xml, I faced issues with session deserialization in background expiration monitor thread. It failed to deseriazile the session because it was using common classloader without webapp serializable models in classpath. Theoretically PersistentManager
could be configured for each web app separately (to have proper classpath) in WEB-INF/context.xml but I failed to make it work.
org.apache.catalina.session.JDBCStore
PersistentManage
was promising because it expose last_access
column for the session so it is not required to deserialize session_data
, but it was saving app_name
all the time causing same session id to be written as different rows for diffrent web apps. Thus session data was not stored in the shared place.
Spring Session has it`s own way to create session id. I was not able to find solution to force Spring Session to create same session id for different web apps.
Solution with core tomcat session id generation (with ability to generate the same for different web apps and RedissonSessionManager
, which store data using session id as the only key and has it's own expiration mechanism) finally worked for me. The solution works perfectly with @SessionScope
spring beans.