JavaWeb中用Filter过滤敏感词汇,应用动态代理设计模式

这是黑马程序员JavaWeb课程Day18留的小练习。
我是个菜鸟写的有点绕了,特别是增强getParameterMap方法那个地方,不过能运行,能替换map里的敏感词汇。

/*这就是整个代码了,这里主要是练习动态代理。感觉这个反射还真的是好用啊
其中getStrings是抽取出来的一个方法,这部分getParameterValue和getParameterMap都是一样的。*/
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Proxy;
import java.util.*;

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

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1.创建代理对象
        ServletRequest re_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), (proxy, method, args) -> {
            ArrayList<String> re_strings = null;
            //增强getParameter方法
            if (method.getName().equals("getParameter")) {
                String str = (String) method.invoke(req, args);
                if (str != null) {
                    for (String word : words) {
                        if (str.equals(word)) {
                            str = str.replaceAll(word, "***");
                        }
                    }
                }
                return str;
            }

            //增强getParameterMap方法
            if (method.getName().equals("getParameterMap")) {
                Map<String, String[]> map = (Map<String, String[]>) method.invoke(req, args);
                Map<String, String[]> stringMap = null;
                if (map != null) {
                    stringMap = new HashMap<>();
                    for (String key : map.keySet()) {
                        //str为一个String
                        re_strings = new ArrayList<>();
                        String[] strings = map.get(key);
                        if (strings != null) {
                            //调用方法 查找字符串数组中的敏感词汇
                            strings = getStrings(re_strings, strings);
                        }
                        stringMap.put(key, strings);
                    }
                }
                return stringMap;
            }
            //增强getParameterValue方法
            if (method.getName().equals("getParameterValue")) {
                String[] strings = (String[]) method.invoke(req, args);
                if (strings != null) {
                    re_strings = new ArrayList<String>();
                    strings = getStrings(re_strings, strings);
                }
                return strings;
            }
            return method.invoke(req, args);
        });
        chain.doFilter(re_req, resp);
    }

    //用于遍历并替换String[]集合的方法
    private String[] getStrings(ArrayList<String> re_strings, String[] strings) {
        for (String string : strings) {
            if (string != null) {
                for (String word : words) {
                    if (string.equals(word))
                        string = string.replaceAll(word, "***");
                }
            }
            re_strings.add(string);
        }
        int size = re_strings.size();
        strings = re_strings.toArray(new String[size]);
        return strings;
    }

    //敏感词汇集合
    ArrayList<String> words = 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));
            for (String line; (line = br.readLine()) != null; )
                words.add(line);
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void destroy() {
    }

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值