敏感詞過濾案例(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();
            }
    
        }
    
    }

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