You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by kf...@apache.org on 2010/06/22 12:09:14 UTC
svn commit: r956838 - in /tomcat/tc6.0.x/trunk: ./
java/org/apache/catalina/ha/session/ webapps/docs/
Author: kfujino
Date: Tue Jun 22 10:09:14 2010
New Revision: 956838
URL: http://svn.apache.org/viewvc?rev=956838&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49445
The change in session ID is notified to other node.
Modified:
tomcat/tc6.0.x/trunk/STATUS.txt
tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties
tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java
tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java
tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml
tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=956838&r1=956837&r2=956838&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Tue Jun 22 10:09:14 2010
@@ -137,12 +137,6 @@ PATCHES PROPOSED TO BACKPORT:
+1: kkolinko, markt
-1:
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49445
- The change in session ID is notified to other node.
- http://svn.apache.org/viewvc?view=revision&revision=955190
- +1: kfujino, markt, rjung
- -1:
-
* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49443
Use remoteIpHeader rather then remoteIPHeader consistently
http://people.apache.org/~markt/patches/2010-06-18-bug49443-tc6.patch
Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java?rev=956838&r1=956837&r2=956838&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/DeltaManager.java Tue Jun 22 10:09:14 2010
@@ -133,22 +133,23 @@ public class DeltaManager extends Cluste
private long sessionReplaceCounter = 0 ;
long processingTime = 0;
private long counterReceive_EVT_GET_ALL_SESSIONS = 0 ;
- private long counterSend_EVT_ALL_SESSION_DATA = 0 ;
private long counterReceive_EVT_ALL_SESSION_DATA = 0 ;
private long counterReceive_EVT_SESSION_CREATED = 0 ;
private long counterReceive_EVT_SESSION_EXPIRED = 0;
private long counterReceive_EVT_SESSION_ACCESSED = 0 ;
private long counterReceive_EVT_SESSION_DELTA = 0;
+ private int counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0 ;
+ private long counterReceive_EVT_CHANGE_SESSION_ID = 0 ;
private long counterSend_EVT_GET_ALL_SESSIONS = 0 ;
+ private long counterSend_EVT_ALL_SESSION_DATA = 0 ;
private long counterSend_EVT_SESSION_CREATED = 0;
private long counterSend_EVT_SESSION_DELTA = 0 ;
private long counterSend_EVT_SESSION_ACCESSED = 0;
private long counterSend_EVT_SESSION_EXPIRED = 0;
private int counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0 ;
- private int counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0 ;
+ private long counterSend_EVT_CHANGE_SESSION_ID = 0;
private int counterNoStateTransfered = 0 ;
-
// ------------------------------------------------------------- Constructor
public DeltaManager() {
super();
@@ -224,7 +225,14 @@ public class DeltaManager extends Cluste
public int getCounterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE() {
return counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE;
}
-
+
+ /**
+ * @return Returns the counterSend_EVT_CHANGE_SESSION_ID.
+ */
+ public long getCounterSend_EVT_CHANGE_SESSION_ID() {
+ return counterSend_EVT_CHANGE_SESSION_ID;
+ }
+
/**
* @return Returns the counterReceive_EVT_ALL_SESSION_DATA.
*/
@@ -274,6 +282,13 @@ public class DeltaManager extends Cluste
public int getCounterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE() {
return counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE;
}
+
+ /**
+ * @return Returns the counterReceive_EVT_CHANGE_SESSION_ID.
+ */
+ public long getCounterReceive_EVT_CHANGE_SESSION_ID() {
+ return counterReceive_EVT_CHANGE_SESSION_ID;
+ }
/**
* @return Returns the processingTime.
@@ -605,6 +620,65 @@ public class DeltaManager extends Cluste
}
/**
+ * Change the session ID of the current session to a new randomly generated
+ * session ID.
+ *
+ * @param session The session to change the session ID for
+ */
+ @Override
+ public void changeSessionId(Session session) {
+ changeSessionId(session, true);
+ }
+
+ public void changeSessionId(Session session, boolean notify) {
+ // original sessionID
+ String orgSessionID = session.getId();
+ super.changeSessionId(session);
+ if (notify) {
+ // changed sessionID
+ String newSessionID = session.getId();
+ try {
+ // serialize sessionID
+ byte[] data = serializeSessionId(newSessionID);
+ // notify change sessionID
+ SessionMessage msg = new SessionMessageImpl(getName(),
+ SessionMessage.EVT_CHANGE_SESSION_ID, data,
+ orgSessionID, orgSessionID + "-"
+ + System.currentTimeMillis());
+ counterSend_EVT_CHANGE_SESSION_ID++;
+ send(msg);
+ } catch (IOException e) {
+ log.error(sm.getString("deltaManager.unableSerializeSessionID",
+ newSessionID), e);
+ }
+ }
+ }
+
+ /**
+ * serialize sessionID
+ * @throws IOException if an input/output error occurs
+ */
+ protected byte[] serializeSessionId(String sessionId) throws IOException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(bos);
+ oos.writeUTF(sessionId);
+ oos.flush();
+ oos.close();
+ return bos.toByteArray();
+ }
+
+ /**
+ * Load sessionID
+ * @throws IOException if an input/output error occurs
+ */
+ protected String deserializeSessionId(byte[] data) throws IOException {
+ ReplicationStream ois = getReplicationStream(data);
+ String sessionId = ois.readUTF();
+ ois.close();
+ return sessionId;
+ }
+
+ /**
* Load Deltarequest from external node
* Load the Class at container classloader
* @see DeltaRequest#readExternal(java.io.ObjectInput)
@@ -1078,7 +1152,8 @@ public class DeltaManager extends Cluste
case SessionMessage.EVT_SESSION_CREATED:
case SessionMessage.EVT_SESSION_EXPIRED:
case SessionMessage.EVT_SESSION_ACCESSED:
- case SessionMessage.EVT_SESSION_DELTA: {
+ case SessionMessage.EVT_SESSION_DELTA:
+ case SessionMessage.EVT_CHANGE_SESSION_ID: {
synchronized(receivedMessageQueue) {
if(receiverQueue) {
receivedMessageQueue.add(msg);
@@ -1216,6 +1291,7 @@ public class DeltaManager extends Cluste
counterReceive_EVT_SESSION_DELTA = 0 ;
counterReceive_EVT_SESSION_EXPIRED = 0 ;
counterReceive_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0;
+ counterReceive_EVT_CHANGE_SESSION_ID = 0;
counterSend_EVT_ALL_SESSION_DATA = 0;
counterSend_EVT_GET_ALL_SESSIONS = 0;
counterSend_EVT_SESSION_ACCESSED = 0 ;
@@ -1223,6 +1299,7 @@ public class DeltaManager extends Cluste
counterSend_EVT_SESSION_DELTA = 0 ;
counterSend_EVT_SESSION_EXPIRED = 0 ;
counterSend_EVT_ALL_SESSION_TRANSFERCOMPLETE = 0;
+ counterSend_EVT_CHANGE_SESSION_ID = 0;
}
@@ -1360,6 +1437,10 @@ public class DeltaManager extends Cluste
handleSESSION_DELTA(msg,sender);
break;
}
+ case SessionMessage.EVT_CHANGE_SESSION_ID: {
+ handleCHANGE_SESSION_ID(msg,sender);
+ break;
+ }
default: {
//we didn't recognize the message type, do nothing
break;
@@ -1528,6 +1609,24 @@ public class DeltaManager extends Cluste
cluster.send(newmsg, sender);
}
+ /**
+ * handle receive change sessionID at other node
+ * @param msg
+ * @param sender
+ * @throws IOException
+ */
+ protected void handleCHANGE_SESSION_ID(SessionMessage msg,Member sender) throws IOException {
+ counterReceive_EVT_CHANGE_SESSION_ID++;
+ DeltaSession session = (DeltaSession) findSession(msg.getSessionID());
+ String newSessionID = deserializeSessionId(msg.getSession());
+ session.setPrimarySession(false);
+ if(notifySessionListenersOnReplication) {
+ session.setId(newSessionID);
+ } else {
+ session.setIdInternal(newSessionID);
+ add(session);
+ }
+ }
/**
* send a block of session to sender
Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties?rev=956838&r1=956837&r2=956838&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/LocalStrings.properties Tue Jun 22 10:09:14 2010
@@ -56,6 +56,7 @@ deltaManager.startClustering=Starting cl
deltaManager.stopped=Manager [{0}] is stopping
deltaManager.unloading.ioe=IOException while saving persisted sessions: {0}
deltaManager.waitForSessionState=Manager [{0}], requesting session state from {1}. This operation will timeout if no session state has been received within {2} seconds.
+deltaManager.unableSerializeSessionID =Unable to serialize sessionID [{0}]
deltaRequest.showPrincipal=Principal [{0}] is set to session {1}
deltaRequest.wrongPrincipalClass=DeltaManager only support GenericPrincipal. Your realm used principal class {0}.
deltaSession.notifying=Notifying cluster of expiration primary={0} sessionId [{1}]
Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java?rev=956838&r1=956837&r2=956838&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessage.java Tue Jun 22 10:09:14 2010
@@ -26,15 +26,13 @@ import org.apache.catalina.ha.ClusterMes
* The following events are currently available:
* <ul>
* <li><pre>public static final int EVT_SESSION_CREATED</pre><li>
+ * <li><pre>public static final int EVT_SESSION_EXPIRED</pre><li>
* <li><pre>public static final int EVT_SESSION_ACCESSED</pre><li>
- * <li><pre>public static final int EVT_ATTRIBUTE_ADDED</pre><li>
- * <li><pre>public static final int EVT_ATTRIBUTE_REMOVED</pre><li>
- * <li><pre>public static final int EVT_SESSION_EXPIRED_WONOTIFY</pre><li>
- * <li><pre>public static final int EVT_SESSION_EXPIRED_WNOTIFY</pre><li>
* <li><pre>public static final int EVT_GET_ALL_SESSIONS</pre><li>
- * <li><pre>public static final int EVT_SET_USER_PRINCIPAL</pre><li>
- * <li><pre>public static final int EVT_SET_SESSION_NOTE</pre><li>
- * <li><pre>public static final int EVT_REMOVE_SESSION_NOTE</pre><li>
+ * <li><pre>public static final int EVT_SESSION_DELTA</pre><li>
+ * <li><pre>public static final int EVT_ALL_SESSION_DATA</pre><li>
+ * <li><pre>public static final int EVT_ALL_SESSION_TRANSFERCOMPLETE</pre><li>
+ * <li><pre>public static final int EVT_CHANGE_SESSION_ID</pre><li>
* </ul>
*
*/
@@ -78,7 +76,11 @@ public interface SessionMessage extends
* When a session state is complete transferred, this is the event.
*/
public static final int EVT_ALL_SESSION_TRANSFERCOMPLETE = 14;
-
+
+ /**
+ * Event type used when a sessionID has been changed.
+ */
+ public static final int EVT_CHANGE_SESSION_ID = 15;
public String getContextName();
Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java?rev=956838&r1=956837&r2=956838&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/SessionMessageImpl.java Tue Jun 22 10:09:14 2010
@@ -69,8 +69,8 @@ public class SessionMessageImpl extends
* The parameters: sessionID must be set.<BR>
* <B>EVT_SESSION_ACCESSED</B><BR>
* The parameters: sessionID must be set.<BR>
- * <B>EVT_SESSION_EXPIRED_XXXX</B><BR>
- * The parameters: sessionID must be set.<BR>
+ * <B>EVT_GET_ALL_SESSIONS</B><BR>
+ * get all sessions from from one of the nodes.<BR>
* <B>EVT_SESSION_DELTA</B><BR>
* Send attribute delta (add,update,remove attribute or principal, ...).<BR>
* <B>EVT_ALL_SESSION_DATA</B><BR>
@@ -78,6 +78,8 @@ public class SessionMessageImpl extends
* <B>EVT_ALL_SESSION_TRANSFERCOMPLETE</B><BR>
* send that all session state information are transfered
* after GET_ALL_SESSION received from this sender.<BR>
+ * <B>EVT_CHANGE_SESSION_ID</B><BR>
+ * send original sessionID and new sessionID.<BR>
* @param contextName - the name of the context (application
* @param eventtype - one of the 8 event type defined in this class
* @param session - the serialized byte array of the session itself
@@ -139,6 +141,7 @@ public class SessionMessageImpl extends
case EVT_SESSION_DELTA : return "SESSION-DELTA";
case EVT_ALL_SESSION_DATA : return "ALL-SESSION-DATA";
case EVT_ALL_SESSION_TRANSFERCOMPLETE : return "SESSION-STATE-TRANSFERED";
+ case EVT_CHANGE_SESSION_ID : return "SESSION-ID-CHANGED";
default : return "UNKNOWN-EVENT-TYPE";
}
}
Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml?rev=956838&r1=956837&r2=956838&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/ha/session/mbeans-descriptors.xml Tue Jun 22 10:09:14 2010
@@ -223,6 +223,11 @@ created by this Manager"
type="long"
writeable="false"/>
<attribute
+ name="counterReceive_EVT_CHANGE_SESSION_ID"
+ description="Count receive EVT_CHANGE_SESSION_ID messages"
+ type="long"
+ writeable="false"/>
+ <attribute
name="counterSend_EVT_GET_ALL_SESSIONS"
description="Count send EVT_GET_ALL_SESSIONS messages"
type="long"
@@ -258,6 +263,11 @@ created by this Manager"
type="long"
writeable="false"/>
<attribute
+ name="counterSend_EVT_CHANGE_SESSION_ID"
+ description="Count send EVT_CHANGE_SESSION_ID messages"
+ type="long"
+ writeable="false"/>
+ <attribute
name="counterNoStateTransfered"
description="Count the failed session transfers noStateTransfered"
type="int"
Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=956838&r1=956837&r2=956838&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Tue Jun 22 10:09:14 2010
@@ -48,6 +48,15 @@
</fix>
</changelog>
</subsection>
+ <subsection name="Cluster">
+ <changelog>
+ <fix>
+ <bug>49445</bug>: When session ID is changed after authentication,
+ ensure the DeltaManager replicates the change in ID to the other nodes
+ in the cluster. (kfujino)
+ </fix>
+ </changelog>
+ </subsection>
<subsection name="Webapps">
<changelog>
<fix>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org