动态代理:在内存中形成代理类
* 实现步骤:
1. 代理对象和真实对象实现相同的接口
2. 代理对象 = Proxy.newProxyInstance();
3. 使用代理对象调用方法。
4. 增强方法
* 增强方式:
1. 增强参数列表
2. 增强返回值类型
3. 增强方法体执行逻辑
具体代码实现:
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1、创建代理对象,增强getParameter方法
ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强getParameter方法
//判断是否是getParameter方法
if (method.getName().equals("getParameter")) {
//增强返回值
//首先获取返回值
String value = (String) method.invoke(req, args);
if (value != null) {
for (String str : list) {
if (value.contains(str)) {
value = value.replaceAll(str, "***");
}
}
}
return value;
}
//增强getParameterValues方法
//判断是否是getParameterValues方法
if (method.getName().equals("getParameterValues")) {
//增强返回值
//首先获取返回值
String[] values = (String[]) method.invoke(req, args);
if (values != null) {
for (int i=0;i<values.length;i++) {
for (String str : list) {
if (values[i].contains(str)) {
String value = values[i].replaceAll(str, "***");
values[i] = value;
}
}
}
}
return values;
}
// 增强getParameterMap方法
//判断是否是getParameterMap方法
if (method.getName().equals("getParameterMap")){
//增强返回值
//首先获取返回值
Map<String, String[]> values = (Map<String, String[]>) method.invoke(req, args);
for (Map.Entry<String, String[]> stringEntry : values.entrySet()) {
for (String[] value : values.values()) {
for(int i=0;i<value.length;i++){
for (String str : list) {
if (value[i].contains(str)) {
String mapValue = value[i].replaceAll(str, "***");
value[i] = mapValue;
}
}
}
}
}
return values;
}
return method.invoke(req, args);
}
});
//2、放行
chain.doFilter(proxy_req, resp);
}
List<String> list = new ArrayList<>();//敏感词汇的集合
@Override
public void init(FilterConfig config) throws ServletException {
try {
//1、获取文件的真实路径
ServletContext servletContext = config.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
//2、读取文件
BufferedReader br = new BufferedReader(new FileReader(realPath));
//3、将文件的每一行数据添加到list中
String line = null;
while ((line = br.readLine()) != null) {
list.add(line);
}
br.close();
System.out.println(list);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void destroy() {
}
}