Author: markt Date: Fri Dec 19 13:56:00 2014 New Revision: 1646722 URL: http://svn.apache.org/r1646722 Log: Refactor to use a serializable session listener to do the removal from the SSO cache when the session expires.
Added: tomcat/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOnListener.java tomcat/trunk/java/org/apache/catalina/ha/session/ReplicatedSessionListener.java Modified: tomcat/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java tomcat/trunk/java/org/apache/catalina/ha/session/DeltaRequest.java tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java Modified: tomcat/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java?rev=1646722&r1=1646721&r2=1646722&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java (original) +++ tomcat/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOn.java Fri Dec 19 13:56:00 2014 @@ -22,6 +22,7 @@ import org.apache.catalina.Container; import org.apache.catalina.Host; import org.apache.catalina.LifecycleException; import org.apache.catalina.Session; +import org.apache.catalina.SessionListener; import org.apache.catalina.authenticator.SingleSignOn; import org.apache.catalina.authenticator.SingleSignOnEntry; import org.apache.catalina.ha.CatalinaCluster; @@ -113,6 +114,11 @@ public class ClusterSingleSignOn extends return result; } + @Override + protected SessionListener getSessionListener(String ssoId) { + return new ClusterSingleSignOnListener(ssoId); + } + // -------------------------------------------------------- MapOwner Methods Added: tomcat/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOnListener.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOnListener.java?rev=1646722&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOnListener.java (added) +++ tomcat/trunk/java/org/apache/catalina/ha/authenticator/ClusterSingleSignOnListener.java Fri Dec 19 13:56:00 2014 @@ -0,0 +1,35 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.catalina.ha.authenticator; + +import org.apache.catalina.authenticator.SingleSignOnListener; +import org.apache.catalina.ha.session.ReplicatedSessionListener; + +/** + * Cluster extension of {@link SingleSignOnListener} that simply adds the marker + * interface {@link ReplicatedSessionListener} which allows the listener to be + * replicated across the cluster along with the session. + */ +public class ClusterSingleSignOnListener extends SingleSignOnListener implements + ReplicatedSessionListener { + + private static final long serialVersionUID = 1L; + + public ClusterSingleSignOnListener(String ssoId) { + super(ssoId); + } +} Modified: tomcat/trunk/java/org/apache/catalina/ha/session/DeltaRequest.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/DeltaRequest.java?rev=1646722&r1=1646721&r2=1646722&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaRequest.java (original) +++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaRequest.java Fri Dec 19 13:56:00 2014 @@ -31,6 +31,7 @@ import java.io.ObjectOutputStream; import java.security.Principal; import java.util.LinkedList; +import org.apache.catalina.SessionListener; import org.apache.catalina.realm.GenericPrincipal; import org.apache.tomcat.util.res.StringManager; @@ -51,6 +52,7 @@ public class DeltaRequest implements Ext public static final int TYPE_ISNEW = 2; public static final int TYPE_MAXINTERVAL = 3; public static final int TYPE_AUTHTYPE = 4; + public static final int TYPE_LISTENER = 5; public static final int ACTION_SET = 0; public static final int ACTION_REMOVE = 1; @@ -59,6 +61,7 @@ public class DeltaRequest implements Ext public static final String NAME_MAXINTERVAL = "__SET__MAXINTERVAL__"; public static final String NAME_ISNEW = "__SET__ISNEW__"; public static final String NAME_AUTHTYPE = "__SET__AUTHTYPE__"; + public static final String NAME_LISTENER = "__SET__LISTENER__"; private String sessionId; private LinkedList<AttributeInfo> actions = new LinkedList<>(); @@ -122,6 +125,14 @@ public class DeltaRequest implements Ext addAction(TYPE_AUTHTYPE,action,NAME_AUTHTYPE, authType); } + public void addSessionListener(SessionListener listener) { + addAction(TYPE_LISTENER, ACTION_SET, NAME_LISTENER ,listener); + } + + public void removeSessionListener(SessionListener listener) { + addAction(TYPE_LISTENER, ACTION_REMOVE, NAME_LISTENER ,listener); + } + protected void addAction(int type, int action, String name, @@ -190,6 +201,14 @@ public class DeltaRequest implements Ext } session.setAuthType(authType,false); break; + case TYPE_LISTENER: + SessionListener listener = (SessionListener) info.getValue(); + if (info.getAction() == ACTION_SET) { + session.addSessionListener(listener); + } else { + session.removeSessionListener(listener); + } + break; default : throw new java.lang.IllegalArgumentException("Invalid attribute info type="+info); }//switch Modified: tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java?rev=1646722&r1=1646721&r2=1646722&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java (original) +++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaSession.java Fri Dec 19 13:56:00 2014 @@ -500,6 +500,33 @@ public class DeltaSession extends Standa return (sb.toString()); } + @Override + public void addSessionListener(SessionListener listener) { + lock(); + try { + super.addSessionListener(listener); + if (deltaRequest != null && listener instanceof ReplicatedSessionListener) { + deltaRequest.addSessionListener(listener); + } + } finally { + unlock(); + } + } + + @Override + public void removeSessionListener(SessionListener listener) { + lock(); + try { + super.removeSessionListener(listener); + if (deltaRequest != null && listener instanceof ReplicatedSessionListener) { + deltaRequest.removeSessionListener(listener); + } + } finally { + unlock(); + } + } + + // ------------------------------------------------ Session Package Methods @Override @@ -741,9 +768,14 @@ public class DeltaSession extends Standa } isValid = isValidSave; - if (listeners == null) { - ArrayList<SessionListener> arrayList = new ArrayList<>(); - listeners = arrayList; + // Session listeners + n = ((Integer) stream.readObject()).intValue(); + if (listeners == null || n > 0) { + listeners = new ArrayList<>(); + } + for (int i = 0; i < n; i++) { + SessionListener listener = (SessionListener) stream.readObject(); + listeners.add(listener); } if (notes == null) { @@ -835,6 +867,17 @@ public class DeltaSession extends Standa } } + // Serializable listeners + ArrayList<SessionListener> saveListeners = new ArrayList<>(); + for (SessionListener listener : listeners) { + if (listener instanceof ReplicatedSessionListener) { + saveListeners.add(listener); + } + } + stream.writeObject(Integer.valueOf(saveListeners.size())); + for (SessionListener listener : saveListeners) { + stream.writeObject(listener); + } } Added: tomcat/trunk/java/org/apache/catalina/ha/session/ReplicatedSessionListener.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/ReplicatedSessionListener.java?rev=1646722&view=auto ============================================================================== --- tomcat/trunk/java/org/apache/catalina/ha/session/ReplicatedSessionListener.java (added) +++ tomcat/trunk/java/org/apache/catalina/ha/session/ReplicatedSessionListener.java Fri Dec 19 13:56:00 2014 @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.catalina.ha.session; + +import java.io.Serializable; + +import org.apache.catalina.SessionListener; + +/** + * This is a marker interface used to indicate an implementation of + * {@link SessionListener} that should be replicated with the session across the + * cluster. + */ +public interface ReplicatedSessionListener extends SessionListener, Serializable { +} --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org