动态代理实现敏感词汇过滤器

使用动态代理增强request的getParameter(),getParameterMap()和getParameterValues()这三个方法,以达到过滤敏感词汇的效果

##步骤

  1. 创建敏感词汇的txt文件
  2. 创建敏感词汇过滤器的Filter类
  3. 创建测试类进行测试
定义敏感词汇的文件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();}}}

注意事项:

  1. 在使用BufferedReader字符缓冲输入流读取文件时,要注意编码问题
  2. 在放行请求时,调用chain的doFilter方法,要注意把代理对象传进去,而不是真实对象
chain.doFilter(proxy_request, resp);
  1. 一定要注意返回值的类型
    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. 敏感词汇过滤器(过滤器技术)

    ​​​ 目录 系列文章目录 文章目录 前言 一.过滤器是什么? 二.使用步骤 1.引入库 2.具体代码示例 总结 前言 使用过滤器技术和文件读入技术 一.过滤器是什么? web中的过滤器和平时生活中的 ...

  2. python项目实战:实现游戏敏感词汇过滤器

    2019独角兽企业重金招聘Python工程师标准>>> 前言 某者荣耀的火爆程度,我就不用多说了,但是呢,其中总有那么一些没有素质的人,各种骂人的话都有,毕竟林子大了什么人都有,但是 ...

  3. python项目实战:实现王者荣耀敏感词汇过滤器

    2019独角兽企业重金招聘Python工程师标准>>> 前言 王者荣耀的火爆程度,我就不用多说了,但是呢,其中总有那么一些没有素质的人,各种骂人的话都有,毕竟林子大了什么人都有,但是 ...

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

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

  5. 过滤器-过滤敏感词汇

    首先要准备好敏感词库,敏感词汇的格式如下: |1 买枪|2 四大舰队|3 其中1代表禁用词:禁用词将禁止提交,2代表审核次:将以高亮字体显示,3代表过滤词:将替换为****, 过滤器代码实现如下: p ...

  6. 敏感词过滤器 filter

    敏感词过滤器 filter /*** 敏感词过滤器*/ public class SensitiveWordsFilter implements Filter {// 敏感词列表private Str ...

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

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

  8. 【前缀树】写一个敏感词过滤器

    1.什么是敏感词过滤 这其实是一个很常见的功能,随处可见以至于你可能都没关注过,基本上在有评论的地方都会有它的身影. 举例来说,你打游戏和别人对喷的时候,是不是一些脏话发不出去哈哈,这些词汇会用*** ...

  9. 用java写敏感词过滤器的代码

    用java写敏感词过滤器的代码 这里采用动态代理,所以要创建proxy代理对象,利用代理,来增强某些方法(getParameter方法.getParameterMap方法.getParameterVa ...

  10. java实现前缀树--过滤敏感词汇

    一.前缀树简单介绍 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它 ...

最新文章

  1. 思科路由器MTU及ip tcp adjust-mss测试
  2. subShell与代码块
  3. 欢迎进入 K同学啊 的博客目录(全站式导航)
  4. Hibernate持久化类与主键生成策略
  5. c语言入门后怎么玩,玩编程如何让人傻并快乐着?
  6. 深度优先搜索——八皇后问题
  7. python列表操作程序_Python入门篇(三)之列表
  8. python unittest断言_python unittest之断言及示例
  9. 山石网科Hillstone防火墙L2TP详细配置步骤(官方最新版)
  10. #344 – 通过CanExecute控制按钮是可用(The CommandBinding CanExecute Determines Whether a Button is Enabled)
  11. 30天自制操作系统——第三天
  12. 把文档所有的字体都缩小一号_科普!关于“天问一号”的所有知识,都在这里了...
  13. 远程为华为RH2288V3服务器安装vmware esxi5.1操作系统
  14. GitHub 上超屌的 9 个 Vue 开源项目
  15. mysql火焰图_Linux 性能分析利器 -火焰图 flame graph
  16. python to_excel 时间格式_分别用Excel和python进行日期格式转换成时间戳格式
  17. 领袖的七个非常重要的根性-余世维
  18. 浙大版《python程序设计》第2章课后习题
  19. 电子行业求职,技术才是硬道理
  20. Blender全新开源动画短片官方灯光渲染教程,文末附高清参数截图+专家级灯光渲染建议

热门文章

  1. 迅雷禁止更新设置方法【禁止升级】【禁止更新】
  2. Java实现本地缓存
  3. CAD迷你看图 4.4.3 中文版 (最强 CAD 看图工具)
  4. 判断是否是微信浏览器
  5. uefi legacy linux知乎,【U盘工具】制作纯净万能“便携系统+pe维护”双系统U盘——UEFI与Legacy双启动...
  6. smartadmin mysql_Smart Admin
  7. DosBox的安装及使用——详细教程
  8. 冒泡排序时间复杂度计算和优化
  9. 小米无线网卡linux,NanoPi NEO安装小米随身WiFi
  10. 远卓:数字化转型的精益化思考