敏感词过滤案例(Filter过滤器)

敏感词汇过滤

  • 需求

    1. 对UserCRUD_case案例中录入的数据进行敏感词汇的过滤
    2. 敏感词汇参考《敏感词汇.txt》
    3. 若是敏感词汇,则替换为***
  • 分析

    • 在进行过滤前后,所获取的request请求对象是同一个,所以我们可以对该对象进行一些修改,然后继续使用该对象
    • 由于request对象中默认不存在修改数据的方法,所以关键是对request对象的getParameter方法进行增强;产生一个新的request对象
    • 放行。传递代理对象
  • 如何增强对象的功能?

    • 设计模式 :一些通用的解决固定问题的模式
      • 可以增强对象功能的设计模式
        1. 装饰模式
        2. 代理模式
          • 概念
            • 真实对象 :被代理的对象
            • 代理对象
            • 代理模式 :代理对象来代理真实对象,来实现增强真实对象功能的目的
          • 实现方式
            1. 静态代理 :有一个类文件藐视代理模式
            2. 动态代理 :在内存中形成代理类
              • 实现步骤
                1. 代理对象和真实对象实现相同的接口
                2. 代理对象 = Proxy.newProxyInstance();
                3. 使用代理对象调用方法
                4. 增强方法
              • 增强方式
                1. 增强参数列表
                2. 增强返回值类型
                3. 增强方法体执行逻辑
  • 本次案例只需要将request请求对象中的敏感词汇替换,然后封装到新的request对象中即可,所以可以选择使用增强返回值类型方法的代理模式来实现

  • 实现getParmeter方法增强的代码:

    package web.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import java.io.*;
    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 SensitiveWordsFilter implements Filter {
        public void destroy() {
        }
    
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            // 1.创建代理对象,增强request的getParameter方法
            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方法
                    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;
                    }
                    return method.invoke(req, args);
                }
            });
    
            chain.doFilter(proxy_req, resp);
        }
    
        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 br = new BufferedReader(new InputStreamReader(new FileInputStream(realPath),"utf-8"));
                // 将文件的每一行添加到list集合中
                String line = null;
                while((line = br.readLine()) != null){
                    list.add(line);
                }
                br.close();
                System.out.println(list);
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章