JavaEE 使用Filter实现敏感词汇过滤器
动态代理实现敏感词汇过滤器
使用动态代理增强request的getParameter(),getParameterMap()和getParameterValues()这三个方法,以达到过滤敏感词汇的效果
##步骤
- 创建敏感词汇的txt文件
- 创建敏感词汇过滤器的Filter类
- 创建测试类进行测试
定义敏感词汇的文件txt
定义敏感词汇过滤器Filter类
import org.apache.commons.beanutils.BeanMap;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.*;/*** 敏感词汇过滤器*/
@SuppressWarnings("all")
@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//创建代理对象ServletRequest proxy_request = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//判断是否是getParameter方法,增强getParameter方法if (method.getName().equals("getParameter")) {//获取参数String value = (String) method.invoke(req, args);//判断参数是否包含敏感词汇if (value != null) {//遍历集合for (String str : list) {if (value.contains(str)) {//替换value = value.replaceAll(str, "***");}}}//增强返回值return value;}if (method.getName().equals("getParameterMap")) {//增强getParameterMap方法//获取参数//定义一个新的map集合Map<String, String[]> newMap = new HashMap<String, String[]>();Map<String, String[]> map = (Map<String, String[]>) method.invoke(req, args);Set<String> keySet = map.keySet();for (String key : keySet) {String[] values = map.get(key);//定义一个String数组String[] newValues = new String[values.length];if (values != null) {for (int i = 0; i < values.length; i++) {//遍历集合for (String s : list) {if (values[i].contains(s)) {values[i] = values[i].replaceAll(s, "***");newValues[i] = values[i];} else {newValues[i] = values[i];}}}}newMap.put(key, newValues);}return newMap;}if (method.getName().equals("getParameterValues")) {//获取参数的值String[] values = (String[]) method.invoke(req, args);//定义一个新数组String[] newValues = new String[values.length];//遍历数组if (values != null) {for (int i = 0; i < values.length; i++) {for (String s : list) {if (values[i].contains(s)) {newValues[i] = values[i].replaceAll(s, "***");break;} else {newValues[i] = values[i];}}}return newValues;}}return method.invoke(req, args);}});//放行chain.doFilter(proxy_request, resp);}private List<String> list = new ArrayList<String>();public void init(FilterConfig config) throws ServletException {try {//加载文件//获取文件的真实路径ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");//读取文件//创建字符缓冲输入流BufferedReader br = new BufferedReader(new FileReader(realPath));String line;while ((line = br.readLine()) != null) {//添加文件内容到集合list.add(line);}} catch (Exception e) {e.printStackTrace();}}}
注意事项:
- 在使用BufferedReader字符缓冲输入流读取文件时,要注意编码问题
- 在放行请求时,调用chain的doFilter方法,要注意把代理对象传进去,而不是真实对象
chain.doFilter(proxy_request, resp);
- 一定要注意返回值的类型
request调用getParameter()方法时,返回的是String
调用getParameterMap方法时,返回的是Map集合,键是String,值是String类型的数组
调用getParameterValues()方法时,返回的是一个String类型的数组
######定义测试类TestServlet
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
import java.util.Set;@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/*String tname = request.getParameter("tname");String tmsg = request.getParameter("tmsg");*/String[] tnames = request.getParameterValues("tname");String[] tmsgs = request.getParameterValues("tmsg");/* Map<String, String[]> map = request.getParameterMap();//遍历mapSet<String> keySet = map.keySet();for (String key : keySet) {String[] values = map.get(key);System.out.println(key + "---" + values[0]);}*/System.out.println(tmsgs[0]);System.out.println(tnames[0]);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}
浏览器直接访问测试的Servlet
控制台的结果
JavaEE 使用Filter实现敏感词汇过滤器相关推荐
- 敏感词汇过滤器(过滤器技术)
目录 系列文章目录 文章目录 前言 一.过滤器是什么? 二.使用步骤 1.引入库 2.具体代码示例 总结 前言 使用过滤器技术和文件读入技术 一.过滤器是什么? web中的过滤器和平时生活中的 ...
- python项目实战:实现游戏敏感词汇过滤器
2019独角兽企业重金招聘Python工程师标准>>> 前言 某者荣耀的火爆程度,我就不用多说了,但是呢,其中总有那么一些没有素质的人,各种骂人的话都有,毕竟林子大了什么人都有,但是 ...
- python项目实战:实现王者荣耀敏感词汇过滤器
2019独角兽企业重金招聘Python工程师标准>>> 前言 王者荣耀的火爆程度,我就不用多说了,但是呢,其中总有那么一些没有素质的人,各种骂人的话都有,毕竟林子大了什么人都有,但是 ...
- 动态代理的分析以及利用动态代理模式进行敏感词汇过滤
动态代理 增强对象的功能: 设计模式:一些通用的解决固定问题的方式 代理模式 概念: (1). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...
- 过滤器-过滤敏感词汇
首先要准备好敏感词库,敏感词汇的格式如下: |1 买枪|2 四大舰队|3 其中1代表禁用词:禁用词将禁止提交,2代表审核次:将以高亮字体显示,3代表过滤词:将替换为****, 过滤器代码实现如下: p ...
- 敏感词过滤器 filter
敏感词过滤器 filter /*** 敏感词过滤器*/ public class SensitiveWordsFilter implements Filter {// 敏感词列表private Str ...
- Filter - 通过拦截器与动态代理实现敏感词汇过滤
需求:将敏感词汇.txt文件中的词语过滤为 -> "***" 分析: 首先加载文档,将文档中的词汇纳入集合中备用,方便后期比对使用. 使用Proxy动态代理将request对 ...
- 【前缀树】写一个敏感词过滤器
1.什么是敏感词过滤 这其实是一个很常见的功能,随处可见以至于你可能都没关注过,基本上在有评论的地方都会有它的身影. 举例来说,你打游戏和别人对喷的时候,是不是一些脏话发不出去哈哈,这些词汇会用*** ...
- 用java写敏感词过滤器的代码
用java写敏感词过滤器的代码 这里采用动态代理,所以要创建proxy代理对象,利用代理,来增强某些方法(getParameter方法.getParameterMap方法.getParameterVa ...
- java实现前缀树--过滤敏感词汇
一.前缀树简单介绍 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它 ...
最新文章
- 思科路由器MTU及ip tcp adjust-mss测试
- subShell与代码块
- 欢迎进入 K同学啊 的博客目录(全站式导航)
- Hibernate持久化类与主键生成策略
- c语言入门后怎么玩,玩编程如何让人傻并快乐着?
- 深度优先搜索——八皇后问题
- python列表操作程序_Python入门篇(三)之列表
- python unittest断言_python unittest之断言及示例
- 山石网科Hillstone防火墙L2TP详细配置步骤(官方最新版)
- #344 – 通过CanExecute控制按钮是可用(The CommandBinding CanExecute Determines Whether a Button is Enabled)
- 30天自制操作系统——第三天
- 把文档所有的字体都缩小一号_科普!关于“天问一号”的所有知识,都在这里了...
- 远程为华为RH2288V3服务器安装vmware esxi5.1操作系统
- GitHub 上超屌的 9 个 Vue 开源项目
- mysql火焰图_Linux 性能分析利器 -火焰图 flame graph
- python to_excel 时间格式_分别用Excel和python进行日期格式转换成时间戳格式
- 领袖的七个非常重要的根性-余世维
- 浙大版《python程序设计》第2章课后习题
- 电子行业求职,技术才是硬道理
- Blender全新开源动画短片官方灯光渲染教程,文末附高清参数截图+专家级灯光渲染建议
热门文章
- 迅雷禁止更新设置方法【禁止升级】【禁止更新】
- Java实现本地缓存
- CAD迷你看图 4.4.3 中文版 (最强 CAD 看图工具)
- 判断是否是微信浏览器
- uefi legacy linux知乎,【U盘工具】制作纯净万能“便携系统+pe维护”双系统U盘——UEFI与Legacy双启动...
- smartadmin mysql_Smart Admin
- DosBox的安装及使用——详细教程
- 冒泡排序时间复杂度计算和优化
- 小米无线网卡linux,NanoPi NEO安装小米随身WiFi
- 远卓:数字化转型的精益化思考