用java写敏感词过滤器的代码

本文介绍了如何使用Java编写敏感词过滤器,采用动态代理技术增强getParameter、getParameterMap和getParameterValues方法,确保对敏感信息的有效过滤。

用java写敏感词过滤器的代码

这里采用动态代理,所以要创建proxy代理对象,利用代理,来增强某些方法(getParameter方法、getParameterMap方法、getParameterValues方法)

@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
    public void destroy() {
    }

    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方法
                        if (method.getName().equals("getParameter")){
                            //增强返回值
                            //获取返回值
                           String value=(String) method.invoke(req, args);
                            if (value!=null){
                                for (String s : list) {
                                    if (value.contains(s)){
                                        value=value.replaceAll(s, "***");
                                    }
                                }
                            }
                            return value;
                        }
                        //判断方法名是否是getParameterMap
                        if (method.getName().equals("getParameterMap")){
                            Map<String, String[]> map=(Map<String, String[]>) method.invoke(req, args);
                            Map<String,String[]> newMap=new HashMap<>();
                            for (String key : map.keySet()) {
                                String[] values = map.get(key);
                                List<String> sb=new ArrayList<>();
                                for (String value : values) {
                                    if (value!=null){
                                        for (String s : list) {
                                            if (value.contains(s)){
                                                value=value.replaceAll(s, "***");
                                            }
                                        }
                                        sb.add(value);
                                    }
                                }
                                String[] sBuffer=new String[values.length];
                                newMap.put(key, (String[]) sb.toArray(sBuffer));
                            }
                            return newMap;
                        }
                        //判断方法名是否是getParameterValues
                        if (method.getName().equals("getParameterValues")){
                            String[] values=(String[])method.invoke(req, args);
                            List<String> newlist=new ArrayList<>();
                            if (values!=null){
                                for (String value : values) {
                                    if (value!=null){
                                        for (String s : list) {
                                            if (value.contains(s)) {
                                                value = value.replaceAll(s, "***");
                                            }
                                        }
                                    }
                                    newlist.add(value);
                                }

                            }
                            String[] sBuffer=new String[newlist.size()];
                            String[] newStr=newlist.toArray(sBuffer);//这里要这样写,因为toArray在转型的时候要加参数,长度就是你要转型的类型长度
                            return newStr;
                        }
                        return method.invoke(req, args);
                    }
                });

        //2.放行
        chain.doFilter(proxy_req, resp);
    }

    private List<String> list=new ArrayList<>();//敏感词汇集合
    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);
            }
            br.close();
            System.out.println(list);
        }catch (Exception e){
            e.printStackTrace();
        }

    }

}

测试代码

@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        /*String name = request.getParameter("name");
        String msg = request.getParameter("msg");
        System.out.println(name+":"+msg);*/

        /*Map<String, String[]> map = request.getParameterMap();
        for (String key : map.keySet()) {
            String[] values = map.get(key);
            for (String value : values) {
                System.out.println(key+":"+value);
            }
        }*/

        String[] hobby = request.getParameterValues("hobby");
        for (String s : hobby) {
            System.out.println(s);
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

其中注释的代码是用来测试前面2段代码的功能(getParameter方法、getParameterMap方法),后面那段代码是用来测试getParameterValues方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值