文章目录
- 一、需求分析
- 二、案例实现
一、需求分析
(1)对案例录入的数据进行敏感词汇过滤
(2)敏感词汇参考敏感词汇.txt
(3)如果是敏感词汇,替换为 ***
可以确定 Filter 和 servlet 中的 request 是同一个 request,但是为了实现过滤器的作用,需要对获得参数进行修改设置,所以需要对 request 对象的 getParameter 方法进行增强。
二、案例实现
这里建立个试验传递非法参数,检验过滤效果
@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {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);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}
敏感词过滤:SensitiveWordsFilter.java
/*** 敏感词汇过滤器*/
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("敏感词过滤。。。");//1.创建代理对象,增强getParameter方法ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic 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//判断方法名是否是 getParameterValuereturn method.invoke(req, args);}});//2.放行chain.doFilter(proxy_req, resp);}private List<String> list = new ArrayList<String>();//敏感词汇集合public void init(FilterConfig config) throws ServletException {System.out.println("init....");try {//1.获取文件真实路径ServletContext servletContext = config.getServletContext();// 注意这里 a.txt 文档存储的是 gbk 格式的中文,否则将乱码String realPath = servletContext.getRealPath("/WEB-INF/classes/a.txt");//2.读取文件BufferedReader br = new BufferedReader(new FileReader(realPath));//3.将文件的每一行数据添加到list中String line = null;while ((line = br.readLine()) != null) {list.add(line);}System.out.println(list);br.close();} catch (Exception e) {e.printStackTrace();}}public void destroy() {}
}
这里注意敏感词文件中如果有中文需要改成 gbk 编码,和BufferedReader对应,这样才不至于乱码