Author: markt
Date: Wed Feb 13 09:28:58 2013
New Revision: 1445517

URL: http://svn.apache.org/r1445517
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54552
Servlet 3.1
Implement HttpSessionIdListener and HttpServletRequest#changeSessionId()
Patch provided by Nick Williams. 

Added:
    tomcat/trunk/java/javax/servlet/http/HttpSessionIdListener.java   (with 
props)
Modified:
    tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java
    tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java
    tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties
    tomcat/trunk/java/org/apache/catalina/connector/Request.java
    tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java
    tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
    tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
    tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
    tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java
    
tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java (original)
+++ tomcat/trunk/java/javax/servlet/http/HttpServletRequest.java Wed Feb 13 
09:28:58 2013
@@ -383,6 +383,17 @@ public interface HttpServletRequest exte
     public HttpSession getSession();
 
     /**
+     * Changes the session ID of the session associated with this request. This
+     * method does not create a new session object it only changes the ID of 
the
+     * current session.
+     *
+     * @return the new session ID allocated to the session
+     * @see HttpSessionIdListener
+     * @since Servlet 3.1
+     */
+    public String changeSessionId();
+
+    /**
      * Checks whether the requested session ID is still valid.
      *
      * @return <code>true</code> if this request has an id for a valid session

Modified: tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java 
(original)
+++ tomcat/trunk/java/javax/servlet/http/HttpServletRequestWrapper.java Wed Feb 
13 09:28:58 2013
@@ -239,6 +239,15 @@ public class HttpServletRequestWrapper e
     }
 
     /**
+     * The default behavior of this method is to call changeSessionId() on the
+     * wrapped request object.
+     */
+    @Override
+    public String changeSessionId() {
+        return this._getHttpServletRequest().changeSessionId();
+    }
+
+    /**
      * The default behavior of this method is to return
      * isRequestedSessionIdValid() on the wrapped request object.
      */

Added: tomcat/trunk/java/javax/servlet/http/HttpSessionIdListener.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/HttpSessionIdListener.java?rev=1445517&view=auto
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/HttpSessionIdListener.java (added)
+++ tomcat/trunk/java/javax/servlet/http/HttpSessionIdListener.java Wed Feb 13 
09:28:58 2013
@@ -0,0 +1,41 @@
+/*
+ * 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 javax.servlet.http;
+
+import java.util.EventListener;
+
+/**
+ * Implementations of this interface are notified when an {@link HttpSession}'s
+ * ID changes. To receive notification events, the implementation class must be
+ * configured in the deployment descriptor for the web application, annotated
+ * with {@link javax.servlet.annotation.WebListener} or registered by calling 
an
+ * addListener method on the {@link javax.servlet.ServletContext}.
+ *
+ * @see HttpSessionEvent
+ * @see HttpServletRequest#changeSessionId()
+ * @since Servlet 3.1
+ */
+public interface HttpSessionIdListener extends EventListener {
+
+    /**
+     * Notification that a session ID has been changed.
+     *
+     * @param se the notification event
+     * @param oldSessionId the old session ID
+     */
+    public void sessionIdChanged(HttpSessionEvent se, String oldSessionId);
+}

Propchange: tomcat/trunk/java/javax/servlet/http/HttpSessionIdListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/LocalStrings.properties Wed 
Feb 13 09:28:58 2013
@@ -52,6 +52,7 @@ coyoteResponse.setBufferSize.ise=Cannot 
 coyoteRequest.getInputStream.ise=getReader() has already been called for this 
request
 coyoteRequest.getReader.ise=getInputStream() has already been called for this 
request
 coyoteRequest.sessionCreateCommitted=Cannot create a session after the 
response has been committed
+coyoteRequest.changeSessionId=Cannot change session ID. There is no session 
associated with this request.
 coyoteRequest.setAttribute.namenull=Cannot call setAttribute with a null name
 coyoteRequest.attributeEvent=Exception thrown by attributes event listener
 coyoteRequest.parseParameters=Exception thrown whilst processing POSTed 
parameters

Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Wed Feb 13 
09:28:58 2013
@@ -2362,6 +2362,30 @@ public class Request
         }
     }
 
+    /**
+     * Changes the session ID of the session associated with this request.
+     *
+     * @return the old session ID before it was changed
+     * @see javax.servlet.http.HttpSessionIdListener
+     * @since Servlet 3.1
+     */
+    @Override
+    public String changeSessionId() {
+
+        Session session = this.getSessionInternal(false);
+        if (session == null) {
+            throw new IllegalStateException(
+                sm.getString("coyoteRequest.changeSessionId"));
+        }
+
+        Manager manager = this.getContext().getManager();
+        manager.changeSessionId(session);
+
+        String newSessionId = session.getId();
+        this.changeSessionId(newSessionId);
+
+        return newSessionId;
+    }
 
     /**
      * Return the session associated with this Request, creating one

Modified: tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/RequestFacade.java Wed Feb 
13 09:28:58 2013
@@ -910,6 +910,16 @@ public class RequestFacade implements Ht
         return getSession(true);
     }
 
+    @Override
+    public String changeSessionId() {
+
+        if (request == null) {
+            throw new IllegalStateException(
+                            sm.getString("requestFacade.nullRequest"));
+        }
+
+        return request.changeSessionId();
+    }
 
     @Override
     public boolean isRequestedSessionIdValid() {

Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java Wed Feb 
13 09:28:58 2013
@@ -50,6 +50,7 @@ import javax.servlet.SessionCookieConfig
 import javax.servlet.SessionTrackingMode;
 import javax.servlet.descriptor.JspConfigDescriptor;
 import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionIdListener;
 import javax.servlet.http.HttpSessionListener;
 
 import org.apache.catalina.Container;
@@ -1282,6 +1283,7 @@ public class ApplicationContext
         if (t instanceof ServletContextAttributeListener ||
                 t instanceof ServletRequestListener ||
                 t instanceof ServletRequestAttributeListener ||
+                t instanceof HttpSessionIdListener ||
                 t instanceof HttpSessionAttributeListener) {
             context.addApplicationEventListener(t);
             match = true;
@@ -1319,6 +1321,7 @@ public class ApplicationContext
                     listener instanceof ServletRequestListener ||
                     listener instanceof ServletRequestAttributeListener ||
                     listener instanceof HttpSessionListener ||
+                    listener instanceof HttpSessionIdListener ||
                     listener instanceof HttpSessionAttributeListener) {
                 return listener;
             }

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Wed Feb 13 
09:28:58 2013
@@ -65,6 +65,7 @@ import javax.servlet.ServletRequestListe
 import javax.servlet.ServletSecurityElement;
 import javax.servlet.descriptor.JspConfigDescriptor;
 import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionIdListener;
 import javax.servlet.http.HttpSessionListener;
 
 import org.apache.catalina.Authenticator;
@@ -4632,6 +4633,7 @@ public class StandardContext extends Con
             if ((results[i] instanceof ServletContextAttributeListener)
                 || (results[i] instanceof ServletRequestAttributeListener)
                 || (results[i] instanceof ServletRequestListener)
+                || (results[i] instanceof HttpSessionIdListener)
                 || (results[i] instanceof HttpSessionAttributeListener)) {
                 eventListeners.add(results[i]);
             }

Modified: tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/ha/session/DeltaManager.java Wed Feb 
13 09:28:58 2013
@@ -26,6 +26,9 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.Iterator;
 
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionIdListener;
+
 import org.apache.catalina.Cluster;
 import org.apache.catalina.Container;
 import org.apache.catalina.Context;
@@ -1471,6 +1474,30 @@ public class DeltaManager extends Cluste
                 
getContext().fireContainerEvent(Context.CHANGE_SESSION_ID_EVENT,
                         new String[] {msg.getSessionID(), newSessionID});
             }
+
+            if (notifySessionListenersOnReplication) {
+                Object listeners[] = getContext().
+                    getApplicationEventListeners();
+                if (listeners != null && listeners.length > 0) {
+                    HttpSessionEvent event =
+                        new HttpSessionEvent(session.getSession());
+
+                    for(Object listener : listeners) {
+                        if (!(listener instanceof HttpSessionIdListener))
+                            continue;
+
+                        HttpSessionIdListener idListener =
+                            (HttpSessionIdListener)listener;
+                        try {
+                            idListener.
+                                sessionIdChanged(event, msg.getSessionID());
+                        } catch (Throwable t) {
+                            log.error(sm.getString(
+                                "standardSession.sessionEvent"), t);
+                        }
+                    }
+                }
+            }
         }
     }
 

Modified: tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java (original)
+++ tomcat/trunk/java/org/apache/catalina/session/ManagerBase.java Wed Feb 13 
09:28:58 2013
@@ -33,6 +33,9 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
 
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionIdListener;
+
 import org.apache.catalina.Container;
 import org.apache.catalina.Context;
 import org.apache.catalina.Engine;
@@ -762,6 +765,25 @@ public abstract class ManagerBase extend
         String newId = session.getIdInternal();
         context.fireContainerEvent(Context.CHANGE_SESSION_ID_EVENT,
                 new String[] {oldId, newId});
+
+        Object listeners[] = context.getApplicationEventListeners();
+        if (listeners != null && listeners.length > 0) {
+            HttpSessionEvent event =
+                new HttpSessionEvent(session.getSession());
+
+            for(Object listener : listeners) {
+                if (!(listener instanceof HttpSessionIdListener))
+                    continue;
+
+                HttpSessionIdListener idListener =
+                    (HttpSessionIdListener)listener;
+                try {
+                    idListener.sessionIdChanged(event, oldId);
+                } catch (Throwable t) {
+                    log.error(sm.getString("standardSession.sessionEvent"), t);
+                }
+            }
+        }
     }
 
 

Modified: 
tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java
 (original)
+++ 
tomcat/trunk/java/org/apache/catalina/websocket/WsHttpServletRequestWrapper.java
 Wed Feb 13 09:28:58 2013
@@ -362,6 +362,11 @@ public class WsHttpServletRequestWrapper
     }
 
     @Override
+    public String changeSessionId() {
+        return getRequest().changeSessionId();
+    }
+
+    @Override
     public boolean isRequestedSessionIdValid() {
         return getRequest().isRequestedSessionIdValid();
     }

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1445517&r1=1445516&r2=1445517&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Wed Feb 13 09:28:58 2013
@@ -111,6 +111,12 @@
         Port storeconfig functionality, which can persist to server.xml and
         context.xml runtime container configuration changes. (remm)
       </add>
+      <add>
+        <bug>54552</bug>: Servlet 3.1. Implement
+        <code>HttpSessionIdListener</code> and
+        <code>HttpServletRequest#changeSessionId()</code>. Patch provided by
+        Nick Williams. (markt) 
+      </add>
     </changelog>
   </subsection>
   <subsection name="Coyote">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to