Index: tomcat/src/main/org/jboss/web/tomcat/tc5/session/JvmRouteValve.java =================================================================== --- tomcat/src/main/org/jboss/web/tomcat/tc5/session/JvmRouteValve.java (revision 57281) +++ tomcat/src/main/org/jboss/web/tomcat/tc5/session/JvmRouteValve.java (working copy) @@ -87,6 +87,7 @@ public void checkJvmRoute(Request req, Response res) throws IOException, ServletException { + String oldsessionId = req.getRequestedSessionId(); HttpSession session = req.getSession(false); if (session != null) { @@ -108,25 +109,33 @@ // Check if incoming session id has JvmRoute appended. If not, append it. boolean setCookie = !req.isRequestedSessionIdFromURL(); - handleJvmRoute(sessionId, jvmRoute, res, setCookie); + handleJvmRoute(oldsessionId, sessionId, jvmRoute, res, setCookie); } } - protected void handleJvmRoute(String sessionId, + protected void handleJvmRoute(String oldsessionId, + String sessionId, String jvmRoute, HttpServletResponse response, boolean setCookie) { // Get requested jvmRoute. // TODO. The current format is assumed to be id.jvmRoute. Can be generalized later. + String receivedJvmRoute = null; + int index = oldsessionId.lastIndexOf("."); + if (index > 0) + { + receivedJvmRoute = oldsessionId.substring(index + 1, sessionId.length()); + } + String requestedJvmRoute = null; - int index = sessionId.lastIndexOf("."); + index = sessionId.lastIndexOf("."); if (index > 0) { requestedJvmRoute = sessionId.substring(index + 1, sessionId.length()); } - String newId = sessionId; + String newId = null; if (!jvmRoute.equals(requestedJvmRoute)) { if (requestedJvmRoute == null) @@ -151,9 +160,22 @@ resetSessionId(sessionId, newId); - if (setCookie) - manager_.setNewSessionCookie(newId, response); } + /* Also check the jvmRoute received (via req.getRequestedSessionId()) */ + if (!jvmRoute.equals(receivedJvmRoute)) + { + if (log_.isDebugEnabled()) + { + log_.debug("handleJvmRoute(): We have detected a failover with different jvmRoute." + + " received one: " + receivedJvmRoute + " new one: " + jvmRoute + ". Will resent the session id."); + } + String base = sessionId.substring(0, index); + newId = base + "." + jvmRoute; + } + + /* Change the sessionid cookie if needed */ + if (setCookie && newId != null) + manager_.setNewSessionCookie(newId, response); } private void resetSessionId(String oldId, String newId)