需求:
1. 对day17_case案例录入的数据进行敏感词汇过滤
2. 敏感词汇参考《敏感词汇.txt》
3. 如果是敏感词汇,替换为 ***
代码分析:
- 需要确定什么地方需要Filter,什么地方需要提交数据到数据库
- 然后确定需要对什么方法进行增强方法功能,这里面用到了动态代理方法,下面会对方法进行介绍
- 确定敏感词汇,将其写进txt文件内,放在src路径下,并且在过滤器初始化的时候,将其每一行添加进一个list集合
- 根据方法来分别确定提交的数据是否有铭感词汇,如果有敏感词汇,将其替换为"***"即可
- 返回修改后的字符串
代码实现:
package zr.web.userlist.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
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.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 敏感词汇过滤器
*/
@WebFilter(value = {"/addUserServlet","/updateUserServlet"})
public class SensitiveWordsFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
/* //在过滤器中用装饰模式把 原装request的功能增强了
//---拦截后台调用的getParamter()方法
MyRequest request = new MyRequest((HttpServletRequest)req);
chain.doFilter(request, resp);//放行*/
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;
}
//判断方法名是否是 getParameterMap
if(method.getName().equals("getParameterMap")){
Map<String, String[]> map=(Map<String, String[]>)method.invoke(req,args);
if (map!=null){
for (int i=0;i<list.size();i++){
String str = list.get(i);
for (String s : map.keySet()) {
if (map.get(s)[0].contains(str)){
map.get(s)[0]=map.get(s)[0].replace(str,"***");
}
}
}
return map;
}
}
//判断方法名是否是 getParameterValue
if (method.getName().equals("getParameterValues")){
String[] value = (String[]) method.invoke(req,args);
//需要把敏感词汇txt每一行的字符都搞到一个字符串数组中
if (value!=null){
for (String str : list) {
for (int i = 0; i <value.length ; i++) {
if (value[i].contains(str)){
value[i].replaceAll(str,"***");
}
}
}
}
return value;
}
return method.invoke(req,args);
}
});
//2.放行
chain.doFilter(proxy_req, resp);
}
private List<String> list =new ArrayList<String>();//敏感词汇集合
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));
//这里面注意由于将txt设置为jbk编码,而且这个流默认也是gbk编码,所以不会出现乱码的情况
//3. 将文件的每一行数据添加到list中
String line=null;
while((line=br.readLine())!=null){
list.add(line);
}
System.out.println(list);
br.close();
} catch (Exception e) {
e.printStackTrace();
}
//3. 将文件的每一行数据添加到list中
}
}
结果演示:
如果提交了数据 12笨蛋
那么过滤后数据为 12***