过滤器Filter案例-实现敏感词汇过滤

Filter概念: web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
过滤器的作用:

  1. 一般用于完成通用的操作,如:登陆验证,统一编码处理、敏感字符过滤…等。
  2. Filter过滤器能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和Response的内容,实现多次过滤。
  3. Filter可以过滤的web组件包括Servlet,JSP和HTML等文件。

Filter的过滤原理
当浏览器向服务器发出资源的请求时,当浏览器满足过滤条件时,Web服务器根据应用程序配置文件设置的过滤规则进行检查。是一次双向过滤的过程

过滤器生命周期方法
init()方法:在服务器启动后,会创建filter对象,然后调用init方法。只执行一次,用于加载资源。
doFilter()方法:每一次请求被拦截资源时,会执行,执行多次。
destroy()方法:在服务器关闭后,filter对象会被销毁,如果服务器时正常关闭,则会执行destroy方法,只执行一次,用于释放资源。
过滤器链(配置多个过滤器)
执行顺序:如果有两个过滤器:过滤器1,过滤器2
过滤器1–>过滤器2–>资源执行–>(返回)–>过滤器2–>过滤1
过滤器先后顺序问题:
注解配置:按照类名的字符串比较规则比较,值小的先执行。
如:Afilter 和 Bfilter,A<B A先执行

过滤器配置
拦截方式配置:dispatcherTypes 资源访问的方式:

//假如时浏览器直接请求index.jsp路径,那么将直接拦截,转发到该路径则不予阻拦
@WebFilter(value = "/index.jsp", dispatcherTypes = DispatcherType.REQUEST)//释放代码chain.doFilter(req, resp);

案例敏感词的过滤:

代理模式详解图:(灵魂画手)、反正意思就似乎用上代理类,效率高,还能过滤掉敏感词汇

为什么要用代理模式?
中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象,而代理类对象可以在客户类和委托对象之间起到中介的作用,其特征是代理类和委托类实现相同的接口。
接下来就是实现代理模式

** public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {String name = req.getParameter("name");//动态代理增强,增强getParameter方法/* 三个参数:1. 类加载器:真实对象.getClass().getClassLoader()2. 接口数组:真实对象.getClass().getInterfaces()3. 处理器:new InvocationHandler()这边的真实对象就是ServletRequest req的参数;*/ServletRequest ser = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {/*   代理逻辑编写的方法:代理对象调用的所有方法都会触发该方法执行参数:1. proxy:代理对象2. method:代理对象调用的方法,被封装为的对象3. args:代理对象调用的方法时,传递的实际参数*///判断是不是getParameter方法if (method.getName().equals("getParameter")){//使用真实对象调用该方法String invoke = (String) method.invoke(req, args);//假如返回的值不为空,则进行敏感字符过滤if (invoke != null ){for (String s : list) {if (invoke.contains(s)){invoke = invoke.replaceAll(s,"***");}}}return invoke;}return method.invoke(req,args);}});String name1 = ser.getParameter("name");String rows = ser.getParameter("rows");System.out.println(rows);chain.doFilter(ser, resp);}//init方法在第一时间进行执行,并且只会执行一次。把每对敏感字符存入到list集合中private List<String> list = new ArrayList<>();@Overridepublic void init(FilterConfig config) throws ServletException {//获取路径try {ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("//WEB-INF//classes//敏感词汇.txt");//防止乱码 用InputStreamReade是从字节流到字符流的桥梁。BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream(realPath),"gbk"));String len = null;while ((len = bufr.readLine()) != null){list.add(len);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}**


效果展示:

你是坏蛋,王八蛋
你是***,***
你是***,***

过滤器Filter总结+案例-实现敏感词汇过滤相关推荐

  1. 动态代理的分析以及利用动态代理模式进行敏感词汇过滤

    动态代理 增强对象的功能: 设计模式:一些通用的解决固定问题的方式 代理模式 概念: (1). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...

  2. Java基于Socket实现聊天、群聊、敏感词汇过滤功能

    首先的话,这个代码主要是我很久以前写的,然后当时还有很多地方没有理解,现在再来看看这份代码,实在是觉得丑陋不堪,想改,但是是真的改都不好改了- 所以,写代码,规范真的很重要. 实现的功能: 用户私聊 ...

  3. 优秀博客 --敏感词汇过滤

    2019独角兽企业重金招聘Python工程师标准>>> 敏感词汇过滤 http://www.cnblogs.com/chenssy/p/3751221.html#2966041 树上 ...

  4. 【敏感词汇过滤算法】基于DFA-前缀树的敏感词汇过滤算法(项目实用)

    在敏感词汇过滤这块,不同的算法所造成的性能差异是非常大的,选择一个合适的算法非常重要.因为以前做算法的时候做过类似前缀树的字符串匹配之类的算法,所以一开始就打算用前缀树做的,后面了解了一下DFA的相关 ...

  5. PHP敏感词汇过滤SDK(树形结构遍历命中违禁词)

    先介绍一下匹配敏感词原理吧,因为没有工具,画的很糙,有疑问直接联系我.(绿色箭头代表命中敏感词,灰色:未命中) base 确定有穷自动机(DFA)算法 比如说"可以"是敏感词,那么 ...

  6. Filter案例之敏感词过滤和代理模式

    一.需求分析 二 .代理模式 1.概念 2.代码实现 代理对象可以强转为真实对象,即对应的接口类: 3.通过代理增强方法 其中,方法对象invoke真实对象,反射原理: 三.过滤敏感词汇案例代码实现 ...

  7. Filter - 通过拦截器与动态代理实现敏感词汇过滤

    需求:将敏感词汇.txt文件中的词语过滤为 -> "***" 分析: 首先加载文档,将文档中的词汇纳入集合中备用,方便后期比对使用. 使用Proxy动态代理将request对 ...

  8. java 过滤器filter使用案例

    主要需要 过滤器类  和配置文件 1.过滤器类 SessionFilter package com.service; import javax.servlet.*; import javax.serv ...

  9. 敏感词汇过滤(不区分大小写)

    最近项目中,用户评论内容需要屏蔽敏感词汇,从网上总结以下方法,(不区分大小写,如想设置大小写敏感,可以把代码中content..toLowerCase()去掉).具体看代码: 1.读取敏感词汇文档 & ...

  10. C#敏感词汇过滤(不是正则)

    System.Text.StringBuilder sb = new System.Text.StringBuilder(text.Length);   string filterText = &qu ...

最新文章

  1. 2021年甘肃省副高考试成绩查询,2021年甘肃卫生资格考试成绩查询-中国卫生人才网...
  2. NEO智能合约反编译工具
  3. 视频直播技术详解(2)采集
  4. OCS 如何在数据库直接给用户增加联络人
  5. 升级版记事本 Notepad++
  6. python随机选择_在python中实现随机选择
  7. P2370 yyy2015c01的U盘(二分+背包)
  8. pcie ep 应该支持哪种interrupt_7寸国产笔记本评测,酷睿处理器+8G+256G,还支持手写笔...
  9. linux下intel无线网卡安装失败,ubuntu 16.04无法安装无线网卡驱动
  10. shell自动化处理_相关知识整理(整理中)20210329
  11. DRF的解析器和渲染器
  12. 踩坑内核参数tcp_tw_recycle
  13. 简单内存泄漏检测方法 解决 Detected memory leaks! 问题
  14. php加载COM组件失败原因及其解决方法
  15. Minimum supported Gradle version is 6.1.1. Current version is 5.6.4
  16. 控制台PHP安装composer,生产线安装composer及php cli配置
  17. 任务调度系统就该这么设计(万能通用),稳的一批!
  18. 前端面试之ES5与ES6的区别
  19. Semgrep结合GitLab实现代码审计实践-服务端
  20. word2vec产生的词向量中出现空格和回车,会导致ValueError: invalid vector on line3 (is this really the text format)

热门文章

  1. java学习顺序_Java学习心得及学习顺序
  2. GitHub客户端上传本地代码
  3. cad立体图怎么旋转看图_CAD趣事之对CAD图纸进行旋转,360°无死角查看的方法-dwg文件查看器...
  4. 摸鱼必备游戏(上班族专用斗地主)
  5. Ip地址的配置与解释
  6. cadence PCB走等长线设置
  7. matlab时变函数,MATLAB在《复变函数》教学中的应用(图文)
  8. 二次规划与非线性规划及matlab应用
  9. javascript 快速入门
  10. 北京2018年通信工程师考试报名通知