这是黑马程序员JavaWeb课程Day18留的小练习。
我是个菜鸟写的有点绕了,特别是增强getParameterMap方法那个地方,不过能运行,能替换map里的敏感词汇。
/*这就是整个代码了,这里主要是练习动态代理。感觉这个反射还真的是好用啊
其中getStrings是抽取出来的一个方法,这部分getParameterValue和getParameterMap都是一样的。*/
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Proxy;
import java.util.*;
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.创建代理对象
ServletRequest re_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), (proxy, method, args) -> {
ArrayList<String> re_strings = null;
//增强getParameter方法
if (method.getName().equals("getParameter")) {
String str = (String) method.invoke(req, args);
if (str != null) {
for (String word : words) {
if (str.equals(word)) {
str = str.replaceAll(word, "***");
}
}
}
return str;
}
//增强getParameterMap方法
if (method.getName().equals("getParameterMap")) {
Map<String, String[]> map = (Map<String, String[]>) method.invoke(req, args);
Map<String, String[]> stringMap = null;
if (map != null) {
stringMap = new HashMap<>();
for (String key : map.keySet()) {
//str为一个String
re_strings = new ArrayList<>();
String[] strings = map.get(key);
if (strings != null) {
//调用方法 查找字符串数组中的敏感词汇
strings = getStrings(re_strings, strings);
}
stringMap.put(key, strings);
}
}
return stringMap;
}
//增强getParameterValue方法
if (method.getName().equals("getParameterValue")) {
String[] strings = (String[]) method.invoke(req, args);
if (strings != null) {
re_strings = new ArrayList<String>();
strings = getStrings(re_strings, strings);
}
return strings;
}
return method.invoke(req, args);
});
chain.doFilter(re_req, resp);
}
//用于遍历并替换String[]集合的方法
private String[] getStrings(ArrayList<String> re_strings, String[] strings) {
for (String string : strings) {
if (string != null) {
for (String word : words) {
if (string.equals(word))
string = string.replaceAll(word, "***");
}
}
re_strings.add(string);
}
int size = re_strings.size();
strings = re_strings.toArray(new String[size]);
return strings;
}
//敏感词汇集合
ArrayList<String> words = new ArrayList<>();
public void init(FilterConfig config) throws ServletException {
try {
ServletContext servletContext = config.getServletContext();
String realPath = servletContext.getRealPath("WEB-INF/classes/敏感词汇.txt");
BufferedReader br = new BufferedReader(new FileReader(realPath));
for (String line; (line = br.readLine()) != null; )
words.add(line);
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void destroy() {
}
}