需求:将敏感词汇.txt文件中的词语过滤为 -> "***"
分析:
首先加载文档,将文档中的词汇纳入集合中备用,方便后期比对使用。
使用Proxy动态代理将request对象的getParameter方法增强,使用反射得到getParameter方法中的字符串(从请求中带来的),与前面提取出来的敏感词汇进行对比 - 判断,最后返回覆盖敏感词汇的字符串,覆盖getParameter方法。
将放行中的request对象替换为Proxy返回的proxy_req
实现:
package cn.xxx.web.filter;
/**
* Created by 加班狂人 on 2022/7/18 9:40
*/
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.ArrayList;
import java.util.List;
@WebFilter("/*")//记得添加拦截路径 不然写完功能没有用武之地
public class SensitiveWordFilter implements Filter {
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 bf = new BufferedReader(new FileReader(realPath));
//将文件的每一行数据都加入到list中
String line = null;
while ((line = bf.readLine()) != null){
list.add(line);
}
bf.close();
System.out.println(list);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
//创建代理对象,增强getParameter方法
ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//增强getParameter方法
if ("getParameter".equals(method.getName())){
//增强返回值
String value = (String) method.invoke(request,args);
if (value != null){
for (String str : list) {
if (value.contains(str)){
//说明包含敏感词汇
value = value.replaceAll(str,"***");
}
}
}
return value;//覆盖getParameter
}
return method.invoke(request,args);
}
});
//放行
chain.doFilter(proxy_req, response); //将放行对象换成 req
}
}
通过写一个简单的servlet来测试一下:
package cn.xxx.web.servlet;
/**
* Created by 加班狂人 on 2022/7/18 10:18
*/
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "TestServlet", value = "/testServlet")
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String msg = request.getParameter("msg");
System.out.println(name+":"+msg);
}
}
测试结果:启动tomcat服务器,在地址栏访问testServlet并加上敏感词汇
http://localhost:8080/case/testServlet?name=王五&msg=莎碧
王五:***
太暴力就不演示了,很难过审