diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/Server.java b/generator/src/main/java/com/reajason/javaweb/memshell/Server.java index 0417c59c..b452b471 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/Server.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/Server.java @@ -101,6 +101,7 @@ public enum Server { */ TongWeb6(new TongWeb6Shell()), TongWeb7(new TongWeb7Shell()), + TongWeb8(new TongWeb8Shell()), /** * 金蝶天燕中间件 diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/generator/ValveGenerator.java b/generator/src/main/java/com/reajason/javaweb/memshell/generator/ValveGenerator.java index 9b0c3939..7ec3d679 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/generator/ValveGenerator.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/generator/ValveGenerator.java @@ -31,6 +31,7 @@ public class ValveGenerator { public static final String BES_VALVE_PACKAGE = "com.bes.enterprise.webtier"; public static final String TONGWEB6_VALVE_PACKAGE = "com.tongweb.web.thor"; public static final String TONGWEB7_VALVE_PACKAGE = "com.tongweb.catalina"; + public static final String TONGWEB8_VALVE_PACKAGE = "com.tongweb.server"; public static class ValveRenameVisitorWrapper implements AsmVisitorWrapper { private final String newPackageName; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/server/ServerToolRegistry.java b/generator/src/main/java/com/reajason/javaweb/memshell/server/ServerToolRegistry.java index 34dcaffc..3e910d8c 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/server/ServerToolRegistry.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/server/ServerToolRegistry.java @@ -41,6 +41,10 @@ public class ServerToolRegistry { shellClass = ValveGenerator.generateValveClass(ValveGenerator.TONGWEB7_VALVE_PACKAGE, shellClass); } + if (isValve && shell instanceof TongWeb8Shell) { + shellClass = ValveGenerator.generateValveClass(ValveGenerator.TONGWEB8_VALVE_PACKAGE, shellClass); + } + if (isValve && shell instanceof BesShell) { shellClass = ValveGenerator.generateValveClass(ValveGenerator.BES_VALVE_PACKAGE, shellClass); } diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/server/TongWeb8Shell.java b/generator/src/main/java/com/reajason/javaweb/memshell/server/TongWeb8Shell.java new file mode 100644 index 00000000..35b91c4a --- /dev/null +++ b/generator/src/main/java/com/reajason/javaweb/memshell/server/TongWeb8Shell.java @@ -0,0 +1,31 @@ +package com.reajason.javaweb.memshell.server; + +import com.reajason.javaweb.memshell.injector.tongweb.*; + +import static com.reajason.javaweb.memshell.ShellType.*; + +/** + * @author ReaJason + * @since 2024/12/27 + */ +public class TongWeb8Shell extends AbstractShell { + + @Override + public Class getListenerInterceptor() { + return TomcatShell.ListenerInterceptor.class; + } + + @Override + public InjectorMapping getShellInjectorMapping() { + return InjectorMapping.builder() + .addInjector(LISTENER, TongWebListenerInjector.class) + .addInjector(JAKARTA_LISTENER, TongWebListenerInjector.class) + .addInjector(FILTER, TongWebFilterInjector.class) + .addInjector(JAKARTA_FILTER, TongWebFilterInjector.class) + .addInjector(VALVE, TongWebValveInjector.class) + .addInjector(JAKARTA_VALVE, TongWebValveInjector.class) + .addInjector(AGENT_FILTER_CHAIN, TongWebFilterChainAgentInjector.class) + .addInjector(CATALINA_AGENT_CONTEXT_VALVE, TongWebContextValveAgentInjector.class) + .build(); + } +} diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterChainAgentInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterChainAgentInjector.java index 4ef65333..1c954ab6 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterChainAgentInjector.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterChainAgentInjector.java @@ -16,6 +16,11 @@ import java.util.zip.GZIPInputStream; public class TongWebFilterChainAgentInjector implements ClassFileTransformer { private static final String TARGET_CLASS = "com/tongweb/web/thor/core/ApplicationFilterChain"; private static final String TARGET_CLASS_1 = "com/tongweb/catalina/core/ApplicationFilterChain"; + private static final String[] TARGET_CLASSES = new String[]{ + "com/tongweb/web/thor/core/ApplicationFilterChain", + "com/tongweb/catalina/core/ApplicationFilterChain", + "com/tongweb/server/core/ApplicationFilterChain" + }; private static final String TARGET_METHOD_NAME = "doFilter"; public static String getClassName() { @@ -39,10 +44,11 @@ public class TongWebFilterChainAgentInjector implements ClassFileTransformer { inst.addTransformer(new TongWebFilterChainAgentInjector(), true); for (Class allLoadedClass : inst.getAllLoadedClasses()) { String name = allLoadedClass.getName(); - if (TARGET_CLASS.replace("/", ".").equals(name) - || TARGET_CLASS_1.replace("/", ".").equals(name)) { - inst.retransformClasses(allLoadedClass); - System.out.println("MemShell Agent is working at " + name + ".doFilter"); + for (String targetClass : TARGET_CLASSES) { + if (targetClass.replace("/", ".").equals(name)) { + inst.retransformClasses(allLoadedClass); + System.out.println("MemShell Agent is working at " + name + ".doFilter"); + } } } } @@ -51,21 +57,23 @@ public class TongWebFilterChainAgentInjector implements ClassFileTransformer { @SuppressWarnings("all") public byte[] transform(final ClassLoader loader, String className, Class classBeingRedefined, ProtectionDomain protectionDomain, byte[] bytes) { - if (TARGET_CLASS.equals(className) || TARGET_CLASS_1.equals(className)) { - defineTargetClass(loader); - try { - ClassReader cr = new ClassReader(bytes); - ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) { - @Override - protected ClassLoader getClassLoader() { - return loader; - } - }; - ClassVisitor cv = getClassVisitor(cw); - cr.accept(cv, ClassReader.EXPAND_FRAMES); - return cw.toByteArray(); - } catch (Exception e) { - e.printStackTrace(); + for (String targetClass : TARGET_CLASSES) { + if (className.equals(targetClass)) { + defineTargetClass(loader); + try { + ClassReader cr = new ClassReader(bytes); + ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES) { + @Override + protected ClassLoader getClassLoader() { + return loader; + } + }; + ClassVisitor cv = getClassVisitor(cw); + cr.accept(cv, ClassReader.EXPAND_FRAMES); + return cw.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } } } return bytes; diff --git a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterInjector.java b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterInjector.java index 843f9038..a02777a2 100644 --- a/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterInjector.java +++ b/memshell/src/main/java/com/reajason/javaweb/memshell/injector/tongweb/TongWebFilterInjector.java @@ -49,6 +49,8 @@ public class TongWebFilterInjector { * /opt/tweb6/lib/twnt.jar * com.tongweb.catalina.core.ApplicationContext * /opt/tweb7/lib/tongweb.jar + * com.tongweb.server.core.ApplicationContext + * /opt/tweb8/lib/tongweb-web.jar */ public List getContext() throws Exception { List contexts = new ArrayList(); @@ -102,14 +104,21 @@ public class TongWebFilterInjector { ClassLoader contextClassLoader = context.getClass().getClassLoader(); try { // tongweb 7 + constructor = contextClassLoader.loadClass("com.tongweb.catalina.core.ApplicationFilterConfig").getDeclaredConstructors()[0]; filterDef = contextClassLoader.loadClass("com.tongweb.web.util.descriptor.web.FilterDef").newInstance(); filterMap = contextClassLoader.loadClass("com.tongweb.web.util.descriptor.web.FilterMap").newInstance(); - constructor = contextClassLoader.loadClass("com.tongweb.catalina.core.ApplicationFilterConfig").getDeclaredConstructors()[0]; } catch (Exception e2) { - // tongweb 6 - filterDef = contextClassLoader.loadClass("com.tongweb.web.thor.deploy.FilterDef").newInstance(); - filterMap = contextClassLoader.loadClass("com.tongweb.web.thor.deploy.FilterMap").newInstance(); - constructor = contextClassLoader.loadClass("com.tongweb.web.thor.core.ApplicationFilterConfig").getDeclaredConstructors()[0]; + try { + // tongweb 6 + constructor = contextClassLoader.loadClass("com.tongweb.web.thor.core.ApplicationFilterConfig").getDeclaredConstructors()[0]; + filterDef = contextClassLoader.loadClass("com.tongweb.web.thor.deploy.FilterDef").newInstance(); + filterMap = contextClassLoader.loadClass("com.tongweb.web.thor.deploy.FilterMap").newInstance(); + } catch (Exception e) { + // tongweb 8 + constructor = contextClassLoader.loadClass("com.tongweb.server.core.ApplicationFilterConfig").getDeclaredConstructors()[0]; + filterDef = contextClassLoader.loadClass("com.tongweb.web.util.descriptor.web.FilterDef").newInstance(); + filterMap = contextClassLoader.loadClass("com.tongweb.web.util.descriptor.web.FilterMap").newInstance(); + } } invokeMethod(filterDef, "setFilterName", new Class[]{String.class}, new Object[]{filterClassName}); invokeMethod(filterDef, "setFilterClass", new Class[]{String.class}, new Object[]{filterClassName}); diff --git a/memshell/src/main/java/com/tongweb/server/Valve.java b/memshell/src/main/java/com/tongweb/server/Valve.java new file mode 100644 index 00000000..1238553f --- /dev/null +++ b/memshell/src/main/java/com/tongweb/server/Valve.java @@ -0,0 +1,19 @@ +package com.tongweb.server; + +import com.tongweb.server.connector.Request; +import com.tongweb.server.connector.Response; + +import javax.servlet.ServletException; +import java.io.IOException; + +public interface Valve { + Valve getNext(); + + void setNext(Valve var1); + + void backgroundProcess(); + + void invoke(Request var1, Response var2) throws IOException, ServletException; + + boolean isAsyncSupported(); +} diff --git a/memshell/src/main/java/com/tongweb/server/connector/Request.java b/memshell/src/main/java/com/tongweb/server/connector/Request.java new file mode 100644 index 00000000..fd0f4bf7 --- /dev/null +++ b/memshell/src/main/java/com/tongweb/server/connector/Request.java @@ -0,0 +1,345 @@ +package com.tongweb.server.connector; + +import javax.servlet.*; +import javax.servlet.http.*; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.Principal; +import java.util.*; + +/** + * @author ReaJason + * @since 2024/12/26 + */ +public class Request implements HttpServletRequest { + @Override + public String getAuthType() { + return ""; + } + + @Override + public Cookie[] getCookies() { + return new Cookie[0]; + } + + @Override + public long getDateHeader(String name) { + return 0; + } + + @Override + public String getHeader(String name) { + return ""; + } + + @Override + public Enumeration getHeaders(String name) { + return null; + } + + @Override + public Enumeration getHeaderNames() { + return null; + } + + @Override + public int getIntHeader(String name) { + return 0; + } + + @Override + public String getMethod() { + return ""; + } + + @Override + public String getPathInfo() { + return ""; + } + + @Override + public String getPathTranslated() { + return ""; + } + + @Override + public String getContextPath() { + return ""; + } + + @Override + public String getQueryString() { + return ""; + } + + @Override + public String getRemoteUser() { + return ""; + } + + @Override + public boolean isUserInRole(String role) { + return false; + } + + @Override + public Principal getUserPrincipal() { + return null; + } + + @Override + public String getRequestedSessionId() { + return ""; + } + + @Override + public String getRequestURI() { + return ""; + } + + @Override + public StringBuffer getRequestURL() { + return null; + } + + @Override + public String getServletPath() { + return ""; + } + + @Override + public HttpSession getSession(boolean create) { + return null; + } + + @Override + public HttpSession getSession() { + return null; + } + + @Override + public boolean isRequestedSessionIdValid() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromCookie() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromURL() { + return false; + } + + @Override + public boolean isRequestedSessionIdFromUrl() { + return false; + } + + @Override + public boolean authenticate(HttpServletResponse response) throws IOException, ServletException { + return false; + } + + @Override + public void login(String username, String password) throws ServletException { + + } + + @Override + public void logout() throws ServletException { + + } + + @Override + public Collection getParts() throws IOException, ServletException { + return Collections.emptyList(); + } + + @Override + public Part getPart(String name) throws IOException, ServletException { + return null; + } + + @Override + public Object getAttribute(String name) { + return null; + } + + @Override + public Enumeration getAttributeNames() { + return null; + } + + @Override + public String getCharacterEncoding() { + return ""; + } + + @Override + public void setCharacterEncoding(String env) throws UnsupportedEncodingException { + + } + + @Override + public int getContentLength() { + return 0; + } + + @Override + public String getContentType() { + return ""; + } + + @Override + public ServletInputStream getInputStream() throws IOException { + return null; + } + + @Override + public String getParameter(String name) { + return ""; + } + + @Override + public Enumeration getParameterNames() { + return null; + } + + @Override + public String[] getParameterValues(String name) { + return new String[0]; + } + + @Override + public Map getParameterMap() { + return Collections.emptyMap(); + } + + @Override + public String getProtocol() { + return ""; + } + + @Override + public String getScheme() { + return ""; + } + + @Override + public String getServerName() { + return ""; + } + + @Override + public int getServerPort() { + return 0; + } + + @Override + public BufferedReader getReader() throws IOException { + return null; + } + + @Override + public String getRemoteAddr() { + return ""; + } + + @Override + public String getRemoteHost() { + return ""; + } + + @Override + public void setAttribute(String name, Object o) { + + } + + @Override + public void removeAttribute(String name) { + + } + + @Override + public Locale getLocale() { + return null; + } + + @Override + public Enumeration getLocales() { + return null; + } + + @Override + public boolean isSecure() { + return false; + } + + @Override + public RequestDispatcher getRequestDispatcher(String path) { + return null; + } + + @Override + public String getRealPath(String path) { + return ""; + } + + @Override + public int getRemotePort() { + return 0; + } + + @Override + public String getLocalName() { + return ""; + } + + @Override + public String getLocalAddr() { + return ""; + } + + @Override + public int getLocalPort() { + return 0; + } + + @Override + public ServletContext getServletContext() { + return null; + } + + @Override + public AsyncContext startAsync() throws IllegalStateException { + return null; + } + + @Override + public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException { + return null; + } + + @Override + public boolean isAsyncStarted() { + return false; + } + + @Override + public boolean isAsyncSupported() { + return false; + } + + @Override + public AsyncContext getAsyncContext() { + return null; + } + + @Override + public DispatcherType getDispatcherType() { + return null; + } +} diff --git a/memshell/src/main/java/com/tongweb/server/connector/Response.java b/memshell/src/main/java/com/tongweb/server/connector/Response.java new file mode 100644 index 00000000..e0b4cc19 --- /dev/null +++ b/memshell/src/main/java/com/tongweb/server/connector/Response.java @@ -0,0 +1,196 @@ +package com.tongweb.server.connector; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Collection; +import java.util.Collections; +import java.util.Locale; + +/** + * @author ReaJason + * @since 2024/12/26 + */ +public class Response implements HttpServletResponse { + @Override + public void addCookie(Cookie cookie) { + + } + + @Override + public boolean containsHeader(String name) { + return false; + } + + @Override + public String encodeURL(String url) { + return ""; + } + + @Override + public String encodeRedirectURL(String url) { + return ""; + } + + @Override + public String encodeUrl(String url) { + return ""; + } + + @Override + public String encodeRedirectUrl(String url) { + return ""; + } + + @Override + public void sendError(int sc, String msg) throws IOException { + + } + + @Override + public void sendError(int sc) throws IOException { + + } + + @Override + public void sendRedirect(String location) throws IOException { + + } + + @Override + public void setDateHeader(String name, long date) { + + } + + @Override + public void addDateHeader(String name, long date) { + + } + + @Override + public void setHeader(String name, String value) { + + } + + @Override + public void addHeader(String name, String value) { + + } + + @Override + public void setIntHeader(String name, int value) { + + } + + @Override + public void addIntHeader(String name, int value) { + + } + + @Override + public void setStatus(int sc) { + + } + + @Override + public void setStatus(int sc, String sm) { + + } + + @Override + public int getStatus() { + return 0; + } + + @Override + public String getHeader(String name) { + return ""; + } + + @Override + public Collection getHeaders(String name) { + return Collections.emptyList(); + } + + @Override + public Collection getHeaderNames() { + return Collections.emptyList(); + } + + @Override + public String getCharacterEncoding() { + return ""; + } + + @Override + public String getContentType() { + return ""; + } + + @Override + public ServletOutputStream getOutputStream() throws IOException { + return null; + } + + @Override + public PrintWriter getWriter() throws IOException { + return null; + } + + @Override + public void setCharacterEncoding(String charset) { + + } + + @Override + public void setContentLength(int len) { + + } + + @Override + public void setContentType(String type) { + + } + + @Override + public void setBufferSize(int size) { + + } + + @Override + public int getBufferSize() { + return 0; + } + + @Override + public void flushBuffer() throws IOException { + + } + + @Override + public void resetBuffer() { + + } + + @Override + public boolean isCommitted() { + return false; + } + + @Override + public void reset() { + + } + + @Override + public void setLocale(Locale loc) { + + } + + @Override + public Locale getLocale() { + return null; + } +}