Sharing Session Data Across WARS
Although sharing session data across WARS is a Servlet 2.4 spec violation, and a potential security issue, there is a semi-reasonable business case for it:
A large application is broken up into multiple WARS, so that new functionality can be pushed out in a more modularized fashion.
While there is a more elegant way to handle this via JBossCache, it is possible to get JBoss 4.0.2 to share session data across WARs. I used http://www.fwd.at/tomcat/sharing-session-data-howto.html as a reference for sharing session data across WARs.
WARNING - I was not able to get this to work in Tomcat 5.5.7 or Tomcat 5.5.9 standalone. Sharing of session data across WARS is a violation of the Servlet 2.4 spec and this workaround should be considered a last resort!
In a nutshell, this is what I did:
Created a simple struts app/configuration for my test JSPs and Actions.
Write a method that stores session data in a "shared" context.
private synchronized void storeDataInContext(ServletContext context, String sessionid, Object data) { //load the shared_userroles from the context Hashtable shareddata = (Hashtable)context.getAttribute("shared_data"); // if not yet available, create a new one if (shareddata==null) { shareddata = new Hashtable(); } // store the userroles of the current session shareddata.put(sessionid, data); // store the shareddata back into the Context context.setAttribute("shared_data", shareddata); System.out.println("I SET THE DATA OBJ TO: " + data); }
Write method that gets data from the shared context.
private Object getDataFromContext(ServletContext context, String sessionid) { // get the Context containing the shared session data ServletContext ssocontext = context.getContext("/wars-session-share"); Object data = null; // read the shareddata Hashtable shareddata = (Hashtable) ssocontext.getAttribute("shared_data"); if (shareddata != null) { // get the right object using the ssosessionid data = shareddata.get(sessionid); } return data; }
Make sure jbossweb-tomcat55.sar\META-INF\jboss-service.xml has UseJBossWebLoader="true". Otherwise, you will get a ClassCastException.
I've attached the source, so you can try this approach. I've included a simple ant build.xml script that'll compile/deploy the code to jboss or tomcat. I don't know why it doesn't work in standalone tomcat, but I'm pretty sure the issue is configuration related.
Comments