文章目录
- 需求
- 效果
- 步骤
- 代码
需求
当用户发言内容里有敏感词汇时,将敏感词汇变为***并在页面输出
效果
1、用户发言
2、对敏感词汇“傻逼”进行过滤,显示发言内容
步骤
1、在工程src源文件下添加文件 敏感词汇.txt
2、新建一个Filter。在filter的init方法下,读取敏感词汇.txt文件里的敏感词汇,将每一个敏感词汇添加到一个list中。在filter的doFilter方法中,在放行资源之前,使用动态代理方式,增强获取参数相关方法。
3、新建一个Servlet,获取参数值并显示内容。
代码
package com.li.web;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;@WebFilter( "/*")
public class FilterDemo implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//创建动态代理ServletRequest request =(ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//对执行的方法进行过滤if(method.getName().equals("getParameter")){//将敏感词汇进行过滤//真实对象执行re.getParameter方法,该方法返回值是参数值,是String类型的String value = (String) method.invoke(req,args);if(value!=null){for (String str : list) {if(value.contains(str)){value = value.replaceAll(str, "***");}}}//System.out.println("filter"+value);return value;}return method.invoke(req,args);}});//放行,第一个参数是代理对象,chain.doFilter(request, resp);}ArrayList<String> list = new ArrayList<String>();//初始化方法中加载资源,这里将敏感词汇添加到list中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 FileReader(realPath));//将文件的每一行数据添加到list中String line = null;while((line=br.readLine())!=null){list.add(line);}System.out.println(list);br.close();}catch (Exception e){e.printStackTrace();}}}