billbarker    2003/01/14 22:11:24

  Modified:    src/facade22/org/apache/tomcat/facade HttpSessionFacade.java
                        Servlet22Interceptor.java
  Log:
  Remember when the actual session has been invalidated.
  
  It is possible for the realSession to become valid again because it is being used by 
somebody else.  Thus we can't rely on the realSession on its own.
  
  Also keep a copy of the sessionId so that we don't return somebody elses Id instead.
  
  I'm going to some lengths here to avoid doing a String comparision for every access.
  
  Hopefully the last fix for bug #15894
  Reported By: Christian Wicke [EMAIL PROTECTED]
  
  Revision  Changes    Path
  1.20      +8 -2      
jakarta-tomcat/src/facade22/org/apache/tomcat/facade/HttpSessionFacade.java
  
  Index: HttpSessionFacade.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/facade22/org/apache/tomcat/facade/HttpSessionFacade.java,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -u -r1.19 -r1.20
  --- HttpSessionFacade.java    10 Jan 2003 05:40:12 -0000      1.19
  +++ HttpSessionFacade.java    15 Jan 2003 06:11:23 -0000      1.20
  @@ -93,6 +93,9 @@
       private static StringManager sm =
           StringManager.getManager("org.apache.tomcat.resources");
       ServerSession realSession;
  +    //  We need to keep the Id, since it may change in realSession.
  +    private String sessionId;
  +    private boolean isValid = false;
       
       HttpSessionFacade() {
       }
  @@ -102,18 +105,21 @@
       void setRealSession(ServerSession s) {
        realSession=s;
        realSession.setFacade( this );
  +     sessionId = realSession.getId().toString();
  +     isValid = true;
        }
   
       /** Package-level method - accessible only by core
        */
       void recycle() {
  +     isValid = false;
        //      realSession=null;
       }
   
       // -------------------- public facade --------------------
   
       public String getId() {
  -     return realSession.getId().toString();
  +     return sessionId;
       }
   
       /**
  @@ -301,7 +307,7 @@
   
       // duplicated code, private
       private void checkValid() {
  -     if (!realSession.getTimeStamp().isValid()) {
  +     if (! (realSession.getTimeStamp().isValid() && isValid )) {
            throw new IllegalStateException
                (sm.getString("standardSession.getAttributeNames.ise"));
        }
  
  
  
  1.22      +3 -0      
jakarta-tomcat/src/facade22/org/apache/tomcat/facade/Servlet22Interceptor.java
  
  Index: Servlet22Interceptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/facade22/org/apache/tomcat/facade/Servlet22Interceptor.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- Servlet22Interceptor.java 12 Oct 2002 06:01:28 -0000      1.21
  +++ Servlet22Interceptor.java 15 Jan 2003 06:11:23 -0000      1.22
  @@ -235,6 +235,9 @@
                    sess.removeAttribute( key );
                }
            }
  +         if( httpSess != null && newState==ServerSession.STATE_EXPIRED ) {
  +             ((HttpSessionFacade)httpSess).recycle();
  +         }
        } 
        return 0;
       }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to