过滤器Filter总结+案例-实现敏感词汇过滤
过滤器Filter案例-实现敏感词汇过滤
Filter概念: web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。
过滤器的作用:
- 一般用于完成通用的操作,如:登陆验证,统一编码处理、敏感字符过滤…等。
- Filter过滤器能够在Servlet被调用之前检查Request对象,并修改Request Header和Request内容;在Servlet被调用之后检查Response对象,修改Response Header和Response的内容,实现多次过滤。
- 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). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...
- Java基于Socket实现聊天、群聊、敏感词汇过滤功能
首先的话,这个代码主要是我很久以前写的,然后当时还有很多地方没有理解,现在再来看看这份代码,实在是觉得丑陋不堪,想改,但是是真的改都不好改了- 所以,写代码,规范真的很重要. 实现的功能: 用户私聊 ...
- 优秀博客 --敏感词汇过滤
2019独角兽企业重金招聘Python工程师标准>>> 敏感词汇过滤 http://www.cnblogs.com/chenssy/p/3751221.html#2966041 树上 ...
- 【敏感词汇过滤算法】基于DFA-前缀树的敏感词汇过滤算法(项目实用)
在敏感词汇过滤这块,不同的算法所造成的性能差异是非常大的,选择一个合适的算法非常重要.因为以前做算法的时候做过类似前缀树的字符串匹配之类的算法,所以一开始就打算用前缀树做的,后面了解了一下DFA的相关 ...
- PHP敏感词汇过滤SDK(树形结构遍历命中违禁词)
先介绍一下匹配敏感词原理吧,因为没有工具,画的很糙,有疑问直接联系我.(绿色箭头代表命中敏感词,灰色:未命中) base 确定有穷自动机(DFA)算法 比如说"可以"是敏感词,那么 ...
- Filter案例之敏感词过滤和代理模式
一.需求分析 二 .代理模式 1.概念 2.代码实现 代理对象可以强转为真实对象,即对应的接口类: 3.通过代理增强方法 其中,方法对象invoke真实对象,反射原理: 三.过滤敏感词汇案例代码实现 ...
- Filter - 通过拦截器与动态代理实现敏感词汇过滤
需求:将敏感词汇.txt文件中的词语过滤为 -> "***" 分析: 首先加载文档,将文档中的词汇纳入集合中备用,方便后期比对使用. 使用Proxy动态代理将request对 ...
- java 过滤器filter使用案例
主要需要 过滤器类 和配置文件 1.过滤器类 SessionFilter package com.service; import javax.servlet.*; import javax.serv ...
- 敏感词汇过滤(不区分大小写)
最近项目中,用户评论内容需要屏蔽敏感词汇,从网上总结以下方法,(不区分大小写,如想设置大小写敏感,可以把代码中content..toLowerCase()去掉).具体看代码: 1.读取敏感词汇文档 & ...
- C#敏感词汇过滤(不是正则)
System.Text.StringBuilder sb = new System.Text.StringBuilder(text.Length); string filterText = &qu ...
最新文章
- 2021年甘肃省副高考试成绩查询,2021年甘肃卫生资格考试成绩查询-中国卫生人才网...
- NEO智能合约反编译工具
- 视频直播技术详解(2)采集
- OCS 如何在数据库直接给用户增加联络人
- 升级版记事本 Notepad++
- python随机选择_在python中实现随机选择
- P2370 yyy2015c01的U盘(二分+背包)
- pcie ep 应该支持哪种interrupt_7寸国产笔记本评测,酷睿处理器+8G+256G,还支持手写笔...
- linux下intel无线网卡安装失败,ubuntu 16.04无法安装无线网卡驱动
- shell自动化处理_相关知识整理(整理中)20210329
- DRF的解析器和渲染器
- 踩坑内核参数tcp_tw_recycle
- 简单内存泄漏检测方法 解决 Detected memory leaks! 问题
- php加载COM组件失败原因及其解决方法
- Minimum supported Gradle version is 6.1.1. Current version is 5.6.4
- 控制台PHP安装composer,生产线安装composer及php cli配置
- 任务调度系统就该这么设计(万能通用),稳的一批!
- 前端面试之ES5与ES6的区别
- Semgrep结合GitLab实现代码审计实践-服务端
- word2vec产生的词向量中出现空格和回车,会导致ValueError: invalid vector on line3 (is this really the text format)