code: @Override
      public void removeAttribute(String name) {
          final boolean bTrace = TraceComponent.isAnyTracingEnabled();
          if (bTrace && tc.isDebugEnabled()) {
              Tr.debug(tc, "removeAttribute: " + name);
          }
          if (isInvalid()) {
              throw new IllegalStateException("Session is invalid");
          }
          Object attr = this.attributes.remove(name);
          if (null == attr) {
              if (bTrace && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Attribute not found");
              }
              return;
          }
          HttpSessionBindingEvent event = null;
          if (attr instanceof HttpSessionBindingListener) {
              // this value wants to know when it's removed
              if (bTrace && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Notifying value; " + attr);
              }
              event = new HttpSessionBindingEvent(this, name, attr);
              ((HttpSessionBindingListener) attr).valueUnbound(event);
          }
          // List<HttpSessionAttributeListener> listeners = this.myConfig.getSessionAttributeListeners();
          // if (null != listeners) {
          // // notify any session-attribute listeners that were registered
          // // in the module configuration
          // if (null == event) {
          // event = new HttpSessionBindingEvent(this, name, attr);
          // }
          // for (HttpSessionAttributeListener listener : listeners) {
          // if (bTrace && tc.isDebugEnabled()) {
          // Tr.debug(tc, "Notifying listener: " + listener);
          // }
          // listener.attributeRemoved(event);
          // }
          // }
      }
docs: /*
  @see javax.servlet.http.HttpSession#removeAttribute(java.lang.String)