Filter实现敏感词汇过滤

太晚了,就不文字说明了直接贴代码,注意增强的是相关方法与参数

package cn.itcast.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
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 SensitiveFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //创建代理对象增强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;
                    
                }


                return method.invoke(req,args);//注意这块传递的是真实对象,与参数
            }
        });


        chain.doFilter(proxy_req, resp);
    }
    private List<String> list = new ArrayList<String>();//敏感词汇的list
    public void init(FilterConfig config) throws ServletException {

        try {
            //1.加载配置文件,获得文件的realPath
            ServletContext servletContext = config.getServletContext();//servletContext是一个域对象,可以读取全局配置参数
            String realPath = servletContext.getRealPath("/WEB-INF/classes/sensitive.txt");//获取文件的一个真实路径
            //2.读取文件
            BufferedReader br = new BufferedReader(new FileReader(realPath));//此时数据以及加载到BufferedReader缓冲器中

            //3.读取br将每一行数据添加到list集合中
            String line = null;
            while((line = br.readLine())!= null){
                list.add(line);
            }
            br.close();
            System.out.println(list);
        } catch ( Exception e) {
            e.printStackTrace();
        }
    }

}

你可能感兴趣的:(Java)