javaWeb用filter动态代理实现敏感词替换

动态代理:在内存中形成代理类
* 实现步骤:
1. 代理对象和真实对象实现相同的接口
2. 代理对象 = Proxy.newProxyInstance();
3. 使用代理对象调用方法。
4. 增强方法
* 增强方式:
1. 增强参数列表
2. 增强返回值类型
3. 增强方法体执行逻辑
具体代码实现:

@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1、创建代理对象,增强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方法
                //判断是否是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;
                }

                //增强getParameterValues方法
                //判断是否是getParameterValues方法
                if (method.getName().equals("getParameterValues")) {
                    //增强返回值
                    //首先获取返回值
                    String[] values = (String[]) method.invoke(req, args);
                    if (values != null) {
                        for (int i=0;i<values.length;i++) {
                            for (String str : list) {
                                if (values[i].contains(str)) {
                                    String value = values[i].replaceAll(str, "***");
                                    values[i] = value;
                                }
                            }
                        }
                    }
                    return values;
                }

                // 增强getParameterMap方法
                //判断是否是getParameterMap方法
                if (method.getName().equals("getParameterMap")){
                    //增强返回值
                    //首先获取返回值
                    Map<String, String[]> values = (Map<String, String[]>) method.invoke(req, args);
                    for (Map.Entry<String, String[]> stringEntry : values.entrySet()) {
                        for (String[] value : values.values()) {
                           for(int i=0;i<value.length;i++){
                                for (String str : list) {
                                    if (value[i].contains(str)) {
                                        String mapValue = value[i].replaceAll(str, "***");
                                        value[i] = mapValue;
                                    }
                                }
                            }
                        }
                    }
                    return values;
                }

                return method.invoke(req, args);
            }
        });
        //2、放行
        chain.doFilter(proxy_req, resp);
    }

    List<String> list = new ArrayList<>();//敏感词汇的集合

    @Override
    public void init(FilterConfig config) throws ServletException {
        try {
            //1、获取文件的真实路径
            ServletContext servletContext = config.getServletContext();
            String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");

            //2、读取文件
            BufferedReader br = new BufferedReader(new FileReader(realPath));

            //3、将文件的每一行数据添加到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();
        }
    }

    @Override
    public void destroy() {
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44790046/article/details/104484216