springboot项目结合filter,jdk代理实现敏感词过滤(简单版)

我们对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我们在这里写个爸爸哈哈哈哈
在这里插入图片描述完了爸爸被屏蔽了,包括儿子,妈妈都是这样了,一家子整整齐齐的哈哈哈哈哈哈
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42875345/article/details/108871604