springboot專案結合filter,jdk代理實現敏感詞過濾(簡單版)

網際網路苟且偷生的大三狗發表於2020-09-29

我們對getParameter()這個方法得到的引數進行敏感詞過濾。
實現思路:利用過濾器攔截所有的路徑請求同時在在過濾器執行的時候對getParameter得到的value值進行過濾。最後呢,到我們自己的實現的邏輯中呢?這個value值就被我們做過處理了。

1:自定義的過濾配置檔案

把檔案位置放在resource下的static目錄下,內容如下
在這裡插入圖片描述

2:編寫我們的過濾器

遇到的問題:拿取不到resource/static/sensitive.txt檔案。好在解決了哈哈哈哈哈哈看程式碼吧!!!!
jdk代理的知識

@WebFilter("/*")
public class filtersensitive implements Filter {
    ArrayList<String> list = new ArrayList<String>();
//     這種寫法會報錯,我也是醉了
//    @Value("classpath:static/sensitive.txt")
//    private Resource resource;

    /**
     * @param
     * @method 初始化我們的過濾詞的配置
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        try {
            String line;
            //讀取我們的過濾配置檔案
            File resource = ResourceUtils.getFile("classpath:static/sensitive.txt");
            BufferedReader sensitivewords = new BufferedReader(new FileReader(resource));
            //把讀取到的資訊,存放到list中
            while ((line = sensitivewords.readLine()) != null) {
                list.add(line);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * @param
     * @method 這裡只針對request中的getParameter方法進行敏感詞過濾
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        //jdk動態代理的使用,我寫過這個的文章哦
        HttpServletRequest request = (HttpServletRequest) Proxy.newProxyInstance(
                req.getClass().getClassLoader(),
                req.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //攔截getParameter方法
                        if ("getParameter".equals(method.getName())) {
                            //呼叫getParameter方法的到value
                            String values = (String) method.invoke(req, args);
                            //如果有getParameter的呼叫,則會進行過濾並且返回經過處理的返回值,其他的直接放行
                            if (values != null) {
                                //與我們初始化的list比較是否要過濾
                                for (String s : list) {
                                    if (values.contains(s)) {
                                        values = values.replaceAll(s, "*");
                                        System.out.println("過濾成功");
                                    }
                                }
                            }
                            return values;
                        } else {
                            return method.invoke(req, args);
                        }
                    }

                });
        //放行
        filterChain.doFilter(request, resp);

    }

    @Override
    public void destroy() {

    }
}

3:註冊過濾器

emmmm以前就是老是忘記註冊了,哈哈哈哈哈哈最後氣的半死

@Configuration
public class filterConfig {
    /**
     * @param
     * @method 註冊攔截器
     */
    @Bean
    public FilterRegistrationBean addMyFilter() {
        filtersensitive filterSensitive = new filtersensitive();
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(filterSensitive);
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }
}

4:測試

emmm我們在這裡寫個爸爸哈哈哈哈
在這裡插入圖片描述完了爸爸被遮蔽了,包括兒子,媽媽都是這樣了,一家子整整齊齊的哈哈哈哈哈哈
在這裡插入圖片描述

相關文章