1.整体思路
2.代码实现
package web.Filter;
import javax.servlet.*;
import javax.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.*;
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
//敏感词汇的集合
private List<String> list = new ArrayList<>();
//使用init方法加载文件避免重复加载
public void init(FilterConfig config) throws ServletException {
//创建缓冲输入流
BufferedReader br = null;
try {
//加载敏感词汇的文件
//项目运行时的目录
ServletContext servletContext = config.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/str.txt");
System.out.println(realPath);
//使用缓冲输入流
br = new BufferedReader(new FileReader(realPath));
String line = null;
while ((line = br.readLine()) != null ) {
list.add(line);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
//创建代理对象(写法固定)
ServletRequest proxy_req =(ServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {
@Override
/**
* @param proxy 使用的对象
* method 调用的方法
* args[] 传递的参数
* @return 过滤后的参数
* */
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强getParameterMap 方法
//判断是否调用
if ("getParameterMap".equals(method.getName())) {
//增强返回值
//获取返回值
//new 一个map集合避免代理参数无法修改
Map<String,String[]> map = new HashMap<>((Map<String, String[]>)method.invoke(request,args));
//拆解Map做判断
for (String key : map.keySet()) {
//获取值
String value = map.get(key)[0];
//遍历敏感词汇
for (String str : list) {
if (value != null) {
if (value.contains(str)) {
value = value.replaceAll(str,"***");
}
}
}
String[] values = {value};
map.put(key,values);
}
return map;
}
//增强getParameterValues
//判断是否调用getParameterValues方法
//未启用
if ("getParameterValues".equals(method.getName())) {
String[] strings = (String[]) method.invoke(request,args);
if (strings.length != 0) {
for (int i = 0; i < strings.length; i++) {
for (String s : list) {
if (strings[i].contains(s)){
strings[i] = strings[i].replaceAll(s,"***");
}
}
}
}
return strings;
}
//增强parameter方法
//判断是否调用getParameter方法
if ("getParameter".equals(method.getName())) {
/**
* @param request 方法是以request请求为载体
* @param args 传递的参数
* */
//增强返回值
//获取返回值
String value = (String) method.invoke(request,args);
//避免空指针异常
if (value != null) {
//获取list集合
for (String str : list) {
System.out.println(str);
//判断value是否包含敏感字符
if (value.contains(str)) {
//替换
value = value.replaceAll(str,"***");
}
}
}
return value;
}
return method.invoke(request,args);
}
});
//放行
chain.doFilter(proxy_req, response);
}
}
3.更优解决方案(挖坑待填)