JavaWeb中filter实现敏感词过滤的一个小案例

首先来讲一下代理设计模式
假设有这样一个卖东西的接口Sale

public interface Sale {
    String sale(double money);
}

然后有一个该接口的实现类 专门卖外星人笔记本的类Alienware

public class Alienware implements Sale {
    @Override
    public String sale(double money) {
        System.out.println("花"+money+"元买了一台外星人");
        return "外星人笔记本";
    }
}

然后一个测试类Test 在主方法中用以下代码测试:

System.out.println("you get:"+alienware.sale(8000));

得到输出:
花8000.0元买了一台外星人
you get:外星人笔记本

生活中一般我们都是通过代理来购买商品的,创建一个代理:
其中生成代理的语法为:
Proxy.newProxyInstance(真实类.getClass().getClassLoader(),真实类.getClass.getInterfaces,new InvocationHandler(){//增强内容})
真实类在本例中就是卖外星人笔记本的原厂商,接受该返回值的store就是代理类的实例对象

Sale store = (Sale)Proxy.newProxyInstance(alienware.getClass().getClassLoader(), alienware.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                //如果是sale方法则增强该方法
                if(method.getName().equals("sale")){
                    double money=(double)objects[0]*0.9;
                    //增强返回值
                    return (String)method.invoke(alienware, money)+"鼠标垫";
                }else {
              		//否则返回原方法
                    return method.invoke(alienware,objects);
                }
            }
        });

然后用以下代码测试:

String s = store.sale(8000);
System.out.println("you get:"+s);

得到结果:
花7200.0元买了一台外星人
you get:外星人笔记本鼠标垫

然后接下来讲fiter实现敏感词过滤的小案例
他的原理就是通过代理增强了request中的getParameter方法
将原先获得到的信息进行处理再次提交
首先创建一个filter过滤器类
其中doFilter方法的代码如下;

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //代理
        ServletRequest newReq=(ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
            	//如果是getParamter方法则增强
                if(method.getName().equals("getParameter")){
                	//获取原有数据
                    String receiveStr= (String) method.invoke(req, objects);
                    //遍历list集合,该集合存储了敏感词
                    for (String s : list) {
                    	//若包含敏感词则替换
                        if(receiveStr.contains(s)){
                            receiveStr=receiveStr.replaceAll(s,"**");
                        }
                    }
                    //返回处理后的字符串
                    return receiveStr;
                }
                //否则返回原有的servletrequst对象
                return method.invoke(req,objects);
            }
        });
        //放行
        chain.doFilter(newReq,resp);
    }

init中的代码:

//创建一个list集合
List<String> list=new ArrayList<>();
    public void init(FilterConfig config) throws ServletException {
        try {
           //获取敏感字符的真实路径
            ServletContext servletContext = config.getServletContext();
            String contextPath = servletContext.getRealPath("/WEB-INF/classes/word.txt");
			//建立一个输入流
            BufferedReader bufferedReader = new BufferedReader(new FileReader(contextPath));
            String line;
            //不为空则写入list集合
            while ((line = bufferedReader.readLine()) != null) {
                list.add(line);
            }
            bufferedReader.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

最后写一个测试类的servlet:

@WebServlet("/test")
public class test extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String word = request.getParameter("word");
        response.getWriter().write(name+":"+word);
    }
}

然后运行tomcat服务器,在servlet地址后加上?name=xxxx&word=敏感词就可以在网页看到过滤后的输出了

你可能感兴趣的:(JAVA)