敏感词汇过滤
-
需求
- 对UserCRUD_case案例中录入的数据进行敏感词汇的过滤
- 敏感词汇参考《敏感词汇.txt》
- 若是敏感词汇,则替换为***
-
分析
- 在进行过滤前后,所获取的request请求对象是同一个,所以我们可以对该对象进行一些修改,然后继续使用该对象
- 由于request对象中默认不存在修改数据的方法,所以关键是对request对象的getParameter方法进行增强;产生一个新的request对象
- 放行。传递代理对象
-
如何增强对象的功能?
- 设计模式 :一些通用的解决固定问题的模式
- 可以增强对象功能的设计模式
- 装饰模式
- 代理模式
- 概念
- 真实对象 :被代理的对象
- 代理对象
- 代理模式 :代理对象来代理真实对象,来实现增强真实对象功能的目的
- 实现方式
- 静态代理 :有一个类文件藐视代理模式
- 动态代理 :在内存中形成代理类
- 实现步骤
- 代理对象和真实对象实现相同的接口
- 代理对象 = Proxy.newProxyInstance();
- 使用代理对象调用方法
- 增强方法
- 增强方式
- 增强参数列表
- 增强返回值类型
- 增强方法体执行逻辑
- 实现步骤
- 概念
- 可以增强对象功能的设计模式
- 设计模式 :一些通用的解决固定问题的模式
-
本次案例只需要将request请求对象中的敏感词汇替换,然后封装到新的request对象中即可,所以可以选择使用增强返回值类型方法的代理模式来实现
-
实现getParmeter方法增强的代码:
package web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
/**
* 敏感词汇过滤器
*/
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
// 1.创建代理对象,增强request的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方法
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;
}
return method.invoke(req, args);
}
});
chain.doFilter(proxy_req, resp);
}
private List<String> list = new ArrayList<String>(); //敏感词汇集合
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 InputStreamReader(new FileInputStream(realPath),"utf-8"));
// 将文件的每一行添加到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();
}
}
}