Search code examples
javajspsessiontomcatservlets

Sharing session data between contexts in Tomcat


I have been looking at solutions for sharing session data between mutliple war files. I came across the following solution http://www.fwd.at/tomcat/sharing-session-data-howto.html

The basic idea of it is that if you have more than one war file, you can set a cookie using the sessionid of the first context that is used.

The cookie can be set using a path that will apply to all contexts/applications.

For example, if I have the following configuration for 3 applications

/myapp/app1
/myapp/app2
/myapp/app3

I can set a cookie as follows

/myapp sessionid.

The sessionid cookie will then be sent to any request with /myapp in the address. This allows the session id to then be used by any of the contexts.

The only problem with this approach is that it was written in 2003 and tested on Tomcat 4.

What are your opinions of this approach? Is there a better way of doing it?

Thanks


Solution

  • That article is indeed heavily outdated.

    On Tomcat 5.5 and 6.0 you can just set emptySessionPath attribute to true in the <Connector> element in /conf/server.xml.

    <Connector ... emptySessionPath="true">
    

    On Tomcat 7.0 this has changed because this is now configureable from the Servlet 3.0 API on. It's then on Tomcat's side configureable by setting sessionCookiePath to / in <Context> element in any responsible context.xml file.

    <Context ... sessionCookiePath="/">
    

    As said, there's a new Servlet 3.0 API which allows you to configure the session cookie through the standard API. You can do it either declaratively by adding the following to the web.xml:

    <session-config>
        <cookie-config>
            <path>/</path>
        </cookie-config>
    </session-config>
    

    or programmatically by SessionCookieConfig which is available by ServletContext#getSessionCookieConfig().

    getServletContext().getSessionCookieConfig().setPath("/");
    

    You could do this in ServletContextListener#contextInitialized() or HttpServlet#init().

    See also: