首页 > 其他分享 >springboot项目结合filter,jdk代理实现敏感词过滤(简单版)

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

时间:2024-01-20 22:04:34浏览次数:42  
标签:springboot jdk getParameter public filter 过滤 values new method


我们对getParameter()这个方法得到的参数进行敏感词过滤。
实现思路:利用过滤器拦截所有的路径请求同时在在过滤器执行的时候对getParameter得到的value值进行过滤。最后呢,到我们自己的实现的逻辑中呢?这个value值就被我们做过处理了。

1:自定义的过滤配置文件

把文件位置放在resource下的static目录下,内容如下

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

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我们在这里写个爸爸哈哈哈哈

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

完了爸爸被屏蔽了,包括儿子,妈妈都是这样了,一家子整整齐齐的哈哈哈哈哈哈

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


标签:springboot,jdk,getParameter,public,filter,过滤,values,new,method
From: https://blog.51cto.com/u_16414043/9346304

相关文章

  • 正确理解springboot国际化简易运行流程
    看源码可以看出–》大致原理localeResolver国际化视图(默认的就是根据请求头带来的区域信息获取Locale进行国际化)返回的本地解析是根据响应头来决定的)接着按住ctrl点localeresolver可知localeresolver是一个接口于是有了这些我们只需通过继承LocaleResolver来自定义我们自己的Loca......
  • springboot中优雅的个性定制化错误页面+源码解析
    boot项目的优点就是帮助我们简化了配置,并且为我们提供了一系列的扩展点供我们使用,其中不乏错误页面的个性化开发。理解错误响应流程我们来到org.springframework.boot.autoconfigure.web.servlet.error下的ErrorMvcAutoConfiguration这里面配置了错误响应的规则。主要介绍里面注册......
  • ConcurrentHashMap源码逐行解读基于jdk1.8
    前导知识//node数组最大容量:2^30=1073741824privatestaticfinalintMAXIMUM_CAPACITY=1<<30;//默认初始值,必须是2的幕数privatestaticfinalintDEFAULT_CAPACITY=16;//数组可能最大值,需要与toArray()相关方法关联st......
  • 模拟jdk动态代理(完整版)
    实现思路1:定义一个字符串s2:加载s利用流生成对应的java文件3:通过类加载器加载java文件生成class文件4:通过class生成代理对象5:测试成功我使用过jdk代理的场景1:通过拦截request对象,代理其中的get参数的方法来过滤敏感词2:通过阅读aop源码发现,底层用的也是动态代理(jdk,cglib)3:jdk代......
  • spring--JDK动态代理的实现原理
    JDK动态代理的实现原理涉及到Java的反射机制。它允许在运行时动态创建一个代理类,这个代理类实现了一组接口,并将所有方法调用转发到一个InvocationHandler实例。下面是JDK动态代理的实现原理的详细步骤:定义接口:首先,定义一个或多个接口,这些接口声明了需要被代理的方法。......
  • spring--JDK动态代理和CGLIB代理的区别
    JDK动态代理和CGLIB代理是Java中常用的两种动态代理实现方式,它们各有特点和适用场景:JDK动态代理:JDK动态代理是基于接口的代理方式,它使用Java反射机制来创建代理对象,并要求目标对象实现一个或多个接口。在代理过程中,JDK动态代理会创建一个实现了目标对象所有接口的代......
  • Filter&Interceptor
    Filter&Interceptor目录Filter&Interceptor1.Filter-过滤器2.Interceptor-拦截器比较应用场景拦截器应用场景过滤器应用场景1.Filter-过滤器在SpringBoot中,过滤器(Filter)是用于在Servlet容器级别拦截和处理HTTP请求的组件。它们通常用于实现诸如身份验证、授权、日志......
  • SpringBoot项目通过注解快速解决,字典翻译,响应数据加密,数据脱敏等问题
    简介在几乎所有SpringBoot项目中都会面临字典翻译,接口数据加密,数据脱敏的问题。在每个接口中单独的解决会非常繁琐,因此接下来介绍一下怎么通过注解快速解决这些问题。实现步骤1.引入maven坐标<dependency><groupId>io.gitee.gltqe</groupId><artifactId>......
  • Java21 + SpringBoot3集成WebSocket
    目录前言相关技术简介什么是WebSocketWebSocket的原理WebSocket与HTTP协议的关系WebSocket优点WebSocket应用场景实现方式添加maven依赖添加WebSocket配置类,定义ServerEndpointExporterBean定义WebSocketEndpoint前端创建WebSocket对象总结前言近日心血来潮想做一个开源项目,目......
  • 《Java并发实现原理:JDK源码剖析》PDF
    《Java并发实现原理:JDK源码剖析》全面而系统地剖析了JavaConcurrent包中的每一个部分,对并发的实现原理进行了深刻的探讨。全书分为8章,第1章从最基础的多线程知识讲起,理清多线程中容易误解的知识点,探究背后的原理,包括内存重排序、happen-before、内存屏障等;第2~8章,从简单到复杂,逐......