Each folder is a project for the middleware to test Memory Shell(including Listener, Filter and Servlet Shell)
A List of Memory Shell related component relationships for some middleware
Middleware: Tomcat、Weblogic、Jetty、JBoss、Glassfish、Resin、TongWeb Framework: Spring MemShell: Listener、Filter、Servlet、Agent Version: Tomcat: 8.5.61 Weblogic: 12.2.1.3.0 Resin: 4.0.65 Jetty: 9.4.44.v20210927 JBoss: 6.1.0.Final Glassfish: 4.1.11 TongWeb: 6.1 The code structure
org.apache.catalina.core.StandardContext (Listener) ——applicationListeners("com.test.MyListener") ——applicationEventListenersList(MyListener@2995) (Filter) ——filterConfigs("MyFilter"->{ApplicationFilterConfig@3869}"ApplicationFilterConfig[name=MyFilter,filterClass=com.test.MyFilter]") ——"MyFilter" ——value ——filterDef->{FilterDef@3883}"FilterDef[filterName=MyFilter,filiterClass=com.test.MyFilter]" ——filterDefs("MyFilter"->{FilterDef@3877}"FilterDef[filterName=Myfilter,filterClass=com.test.MyFilter]") ——filterMaps ——array(Tomcat 7,8,9; no array in Tomcat 6) ——0("FilterMap[filterName=MyFilter,urlPattern=/mem]") (Servlet) ——servletMappings ——"/my"->"MyServlet" ——children ——"MyServlet"->{StandardWrapper@3903}"StandardEngine[Catalina].StandardHost[localhost].StandardContext[/xxx]" Differences between versions
// Filter // Tomcat 8 org.apache.tomcat.util.descriptor.web.FilterMap org.apache.tomcat.util.descriptor.web.FilterDef // Tomcat 7 org.apache.catalina.deploy.FilterMap org.apache.catalina.deploy.FilterDef The way to get Context
ThreadGroup.threads -> http-nio-8088-Acceptor-0 -> NioEndpoint$Acceptor -> NioEndpoint -> AbstractProtocol$ConnectionHandler -> Http11NioProtocol -> CoyoteAdapter -> Connector -> StandardService -> StandardEngine -> StandardHost -> StandardContext The code structure
WebAppServletContext (Listener) ——eventsManager ——requestListeners(type of ServletRequestListener) ——ctxListeners(type of WebLoigcServletContextListener) (Filter) ——filterManager ——filters ——key="MyFilter" ——value={FilterWrapper@24882} ——filterName="MyFilter" ——filterClassName="com.test.MyFilter" ——filter={MyFilter@24899} ——filterPatternList ——0 ——filterName="MyFilter" ——map={ServletMapping@24888} ——matchMap ——"/mem" (Servlet) ——servletMapping ——matchMap ——"/test"->{StandardURLMapping$FullMatchNode@18313} ——key="/test" ——value={StandardURLMapping$FullMatchNode@26097} ——exactValue={URLMatchHelper@26114} ——pattern="/test" ——servletStub={ServletStubImpl} ——extensionMap ——servletStubs ——"MyServlet"->{ServletStubImpl@18288} ——key="MyServlet" ——value={ServletStubImpl@26064} ——name="MyServlet" ——className="com.test.MyServlet" ——classLoader ——cachedClasses ——"com.test.MyServlet" ——"com.test.MyFilter" ——"com.test.MyListener" ——key="com.test.MyListener" ——value={Class@17035} ——name="com.test.MyListener" ——classLoader The way to get Context
ThreadGroup.threads -> ExecuteThread.workEntry -> ContainerSupportProviderImpl$WlsRequestExecutor -> HttpConnectionHandler -> ServletRequestImpl -> WebAppServletContext Thread(weblogic.timers.internal.TimerThread) -> TimerManagerImpl -> ServerTimeImpl -> AsyncContextTimer -> WebAppServletContext some threads: weblogic.server.channels.ServerListenThread weblogic.work.ExecuteThread weblogic.kernel.ServerExecuteThread weblogic.timers.internal.TimerThread$Thread com.oracle.common.internal.util.TimerThread com.octetstring.vde.DoSManager com.octetstring.vde.backend.standard.TransactionProcessor ... The code structure
com.caucho.server.webapp.WebApp (Listener) ——_listeners ——0 ——_listenerClass={Class@3501} ——name="com.test.MyListener" ——_object={MyListener@3557} (Filter) ——_filterManager ——_filters ——"MyFilter" ——key="MyFilter" ——vlaue={FilterConfigImpl} ——_filterName="MyFilter" ——_filterClassName="com.test.MyFilter" ——_filterClass={Class@3480}"com.test.MyFilter" ——_filterManager ——_filterMapper ——_filterMap ——0 ——_urlPattern="/mem" ——_filterName="MyFilter" (Servlet) ——_servletManager ——_servlets ——"MyServlet"(ServletConfigImpl@5758) ——_servletMapper ——_urlPatterns ——"MyServlet" ——key="MyServlet" ——value={HashSet@5800} ——0="/test" Differences between versions
// filter // Resin 4 _webApp.getClass().getDeclaredMethod("addFilter",FilterConfigImpl.class) _webApp.getClass().getDeclaredField("_filterMapper") _webApp.getClass().getDeclaredField("_loginFilterMapper") // Resin 3 _webApp.getClass().getSuperClass().getDeclaredMethod("addFilter",FilterConfigImpl.class) _webApp.getClass().getSuperClass().getDeclaredField("_loginFilterMapper") //Listener // Resin 4 com.caucho.server.webapp.ListenerConfig _webApp.getClass().getDeclaredMethod("addListener",ListenerConfig.class) // Resin 3 com.caucho.server.webapp.Listener _webApp.getClass().getSuperClass().getDeclaredMethod("addListener",Listener.class) The way to get Context
com.caucho.server.dispatch.ServletInvocation -> HttpServletRequestImpl -> WebApp The code structure
org.eclipse.jetty.webapp.WebAppContext (Listener) ——_eventListeners(WebAppContext->ServletContextHandler->ContextHandler) ——0={IntrospectorCleaner@3941} ——1={MyListener@3341} ——_servletRequestListeners ——0={MyListener@3341} ——_servletHandler (Filter) ——_filters ——0={FilterHolder@3970} ——_filter={MyFilter@3974} ——_name="MyFilter" ——_class={Class@3152}"class com.test.MyFilter" ——_className="com.test.MyFilter" ——_filterMappings ——0={FilterMapping@3987}"[/filter]/[]/[REQUEST]=>MyFilter" ——_filterName="MyFilter" ——_holder={FilterHolder@3970} "MyFilter==test.MyFilter@7f2f9ebc{inst=true,async=false,src=DESCRIPTOR:file:///xxx/WEB-INF/web.xml}" ——_pathSpecs={String[1]@3995}["/filter"] ——_filterNameMap ——"MyFilter" -> {FilterHolder@3970} ——key="MyFilter" ——value={FilterHolder@3970} (Servlet) ——_servlets ——0={ServletHolder@4073} ——_name="MyServlet" ——_class={Class@3152}"class com.test.MyServlet" ——_className="com.test.MyServlet" ——_servletMappings ——0={ServletMapping@4085}[/servlet]=>MyServlet ——_servletname="MyServlet" ——_pathSpecs={String[1]@3995}["/servlet"] The way to get Context
java.lang.ThreadLocal$ThreadLocalMap$Entry -> org.eclipse.jetty.webapp.WebAppContext$Context -> WebAppContext The code structure(Similar to Tomcat)
org.apache.catalina.core.StandardContext (Listener) ——applicationListeners("com.test.MyListener") ——applicationEventListenersInstances(Object[1]@12599) ——0={MyListener@11482} ——listenersInstances(Object[1]@12599) ——0={MyListener@11482} (Filter) ——filterConfigs("MyFilter"->{ApplicationFilterConfig@3869}"ApplicationFilterConfig[name=MyFilter,filterClass=com.test.MyFilter]") ——"MyFilter" ——value ——filterDef->{FilterDef@3883}"FilterDef[filterName=MyFilter,filiterClass=com.test.MyFilter]" ——filter={MyFilter@12685} ——filterDefs("MyFilter"->{FilterDef@3877}"FilterDef[filterName=Myfilter,filterClass=com.test.MyFilter]") ——filterMaps ——0={FilterMap@12703}"FilterMap[filterName=MyFilter,urlPattern=/filter]" (Servlet) ——servletMappings ——"/my"->"MyServlet" ——children ——"MyServlet"->{StandardWrapper@3903}"StandardEngine[Catalina].StandardHost[localhost].StandardContext[/xxx]" Differences between versions
// Filter FilterMap: addURLPattern in JBoss 6; setURLPattern in JBoss 4 The way to get Context
ThreadGroup.threads -> http-8088-Acceptor-0 -> JioEndpoint$Acceptor -> JioEndpoint -> Http11NioProtocol$Http11ConnectionHandler -> RequestGroupInfo -> Request -> StandardContext The code structure(Similar to Tomcat)
com.sun.enterprise.web.WebModule(.Superclass.Superclass-> org.apache.catalina.core.StandardContext) (Listener) ——eventListeners(ArrayList@8376) ——0={MyListener@7079} (Filter) ——filterConfigs("MyFilter"->{ApplicationFilterConfig@3869}"ApplicationFilterConfig[name=MyFilter,filterClass=com.test.MyFilter]") ——"MyFilter" ——key="MyFilter" ——value ——filterDef->{FilterDef@3883}"FilterDef[filterName=MyFilter,filiterClass=com.test.MyFilter]" ——filter={MyFilter@12685} ——filterDefs("MyFilter"->{FilterDef@3877}"FilterDef[filterName=Myfilter,filterClass=com.test.MyFilter]") ——filterMaps ——0={FilterMap@12703}"FilterMap[filterName=MyFilter,urlPattern=/filter]" ——filterName="MyFilter" ——urlPattern="/filter" (Servlet) ——servletMappings ——"/my"->"MyServlet" ——children ——"MyServlet"->{StandardWrapper@3903}"StandardEngine[Catalina].StandardHost[localhost].StandardContext[/xxx]" ——servletRegisMap={ConcurrentHashMap@7141} ——"MyServlet"->{WebServletRegistrationImpl@7222} The way to get Context
ThreadGroup.threads -> Thread[ContainerBackgroundProcessor] -> ContainerBase$ContainerBackgroundProcessor -> WebModule The code structure(Similar to Tomcat)
com.tongweb.web.thor.core.ThorStandardContext(.Superclass-> com.tongweb.web.thor.core.StandardContext) (Listener) ——applicationListeners (Filter) ——filterConfigs={HaashMap@11475} ——table ——0 ——key="MyFilter" ——value={ApplicationFilterConfig@11543} ——filter={MyFilter@12685} ——filterDef->{FilterDef@3883}"FilterDef[filterName=MyFilter,filiterClass=com.test.MyFilter]" ——filterClass="com.test.MyFilter" ——filterName="MyFilter" ——filterDefs={HaashMap@11476} ——table ——0 ——key="MyFilter" ——value={FilterDef@11547} ——filterClass="com.test.MyFilter" ——filterName="MyFilter" ——filterMaps ——array={FilterMap[2]@11558} ——0={FilterMap@11559}"FilterMap[filterName=MyFilter,urlPattern=/filter]" ——filterName="MyFilter" ——urlPatterns={String[1]@11563} ——0="/filter" (Servlet) ——servletMappings(HashMap@11490) ——table={HashMap$Entry[16]@11566} ——0={HashMap$Entry@11568} ——key="/servlet" ——value="MyServlet" ——children(HashMap@11510) ——table ——0={HashMap$Entry@11583} ——key="MyServlet" ——value={ThorStandardWrapper@11452} ——instance={MyFilter@11368} ——servletClass="com.test.MyFilter" ——mappings={ArrayList@11592} ——elementData={Object[2]@11610} ——0="/servlet" ——name="MyFilter" The way to get Context
ThreadGroup.threads -> http-nio-8088-Acceptor-0 -> NioEndpoint$Acceptor -> NioEndpoint -> ThorHttp11NioProtocol$ThorHttpConnectionHandler -> RequestGroupInfo -> ThorRequest -> ThorStandardContext (1) The listener/filter/servlet is not configured in web.xml
(2) There is no class file for this listener/filter/servlet
(3) The loader for this listener/filter/servlet is com.sun.org.apache.bcel.internal.util.ClassLoader/com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl$TransletClassLoader and so on