案例说明:在index.jsp页面通过表单提交一段文字,跳转到Servlet01,但在跳转到Servlet01前,会先将请求交给过滤器EncodingFilter(统一编码过滤器),SensitiveWordFilter(敏感词过滤器),过滤后,再跳转到Servlet01,在控制台打印出经过滤后所提交的文字。

-index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>$Title$</title></head><body><form action="test" method="post"><textarea name="txt"></textarea><input type="submit" value="发送"></form></body>
</html>
  • EncodingFilter(统一编码过滤器)
@WebFilter("/*")
public class EncodingFilter implements Filter {public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;//统一解决乱码问题//1.解决响应的中文乱码response.setContentType("text/html;charset=utf-8");//2.解决请求的中文乱码:post方式if ("POST".equalsIgnoreCase(request.getMethod())) {request.setCharacterEncoding("utf-8");}//3.放行请求chain.doFilter(request, response);}public void init(FilterConfig config) throws ServletException {}
}
  • sensitiveWords.txt(敏感词词库)

  • SensitiveWordFilter(敏感词过滤器)

@WebFilter(filterName="SensitiveWordFilter", urlPatterns="/*")
public class SensitiveWordFilter implements Filter {private List<String> list=new ArrayList<>();public void destroy() {}public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {HttpServletRequest httpServletRequest= (HttpServletRequest) req;Myreq myreq = new Myreq(httpServletRequest,list);chain.doFilter(myreq, resp);}public void init(FilterConfig config) throws ServletException {ServletContext servletContext = config.getServletContext();InputStream resourceAsStream=null;InputStreamReader inputStreamReader = null;BufferedReader bufferedReader=null;try {//根据web工程下的文件资源路径,得到一个流对象resourceAsStream = servletContext.getResourceAsStream("file/sensitiveWords.txt");//InputStreamReader:将InputStream转换为Reader(将字节的输入流按指定字符集转换为字符的输入流),需指定编码不然会乱码inputStreamReader = new InputStreamReader(resourceAsStream,"UTF-8");//创建缓冲流对象:它是处理流,对节点流进行包装bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {list.add(str);}} catch (Exception e) {e.printStackTrace();}finally {try {if(resourceAsStream!=null){resourceAsStream.close();}} catch (IOException e) {e.printStackTrace();}}}}//装饰模式
/*创建一个装饰类,对request的getParameter方法进行增强:获取替换敏感词之后的字符串HttpServletRequestWrapper类是HttpServletRequest的装饰类,该类并没有直接给HttpServletRequest的任何方法增强功能,我们创建一个类继承HttpServletRequestWrapper,重写想要增强功能的方法(如:这里的getParameter,使这个方法有更多功能)。然后我们创建这个类的对象,在chain.doFilter(myreq, resp)传到Servlet,调用getParameter则是调用的我们重写的方法。*/
class Myreq extends HttpServletRequestWrapper {private HttpServletRequest httpServletRequest;private List<String> list=new ArrayList<>();//    public Myreq(HttpServletRequest request) {//        super(request);//把请求赋值给被装饰对象
//        httpServletRequest=request;
//    }//public Myreq(HttpServletRequest request,List list) {super(request);httpServletRequest=request;this.list=list;}@Overridepublic String getParameter(String name) {String txt = httpServletRequest.getParameter(name);//当txt不为空的时候if(txt!=null&&!txt.isEmpty()){//分别对每一个敏感字循环一次for (int i = 0; i <list.size() ; i++) {//如果在txt中发现此次循环的敏感字则将其替换为"**",没有发现则不执行替换方法if(txt.indexOf(list.get(i))!=-1) {txt=txt.replaceAll(list.get(i), "**");}//也可以直接替换// txt = txt.replace(list.get(i), "**");}}return txt;}
}/*
1.replace与replaceAll简要介绍:replace和replaceAll是JAVA中常用的替换字符的方法。
replace:把源字符串中的某一字符或字符串 全部 换成指定的字符或字符串。
replaceAll:源字符串中的某一字符或字符串 全部 换成指定的字符或字符串,基于规则表达式的替换。
replaceFirst:只替换第一次出现的字符串,基于规则表达式的替换。
注:replaceAll()和replaceFirst()所用的参数不是基于规则表达式的,则与replace()替换字符串的效果一样。2.indexOf(String str): 返回指定字符串str在方法调用者中第一次出现处的起始索引,如果此字符串中没有这样的字符,则返回 -1。*/
  • Servlet01
@WebServlet(name = "Servlet01",urlPatterns = "/test")
public class Servlet01 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String txt = request.getParameter("txt");System.out.println("Servlet01接收的信息:"+txt);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

测试效果:

浏览器输入,发送:

Servlet01获取请求消息,控制台输出:

Filter的使用场景:敏感词过滤相关推荐

  1. 【Filter过滤器案例】登录验证+敏感词过滤

    登录验证 >>> 思路: >>> 先假设拦截所有资源(Servlet, jsp...均不让访问),判断资源是否与登录有关: >>> 1.与登录相关 ...

  2. JavaWeb-过滤器Filter学习(四)敏感词过滤实例

    通过Filter来实现留言板的敏感词过滤- 思路很简单,我们这里的敏感词是直接先放进去的,实际项目中,肯定是存在数据库中.在Filter 过滤器中,我们先拿到用户提交的留言,如果出现了敏感词,我们就用 ...

  3. 5分钟Serverless实践 | 构建无服务器的敏感词过滤后端系统

    前言 在上一篇"5分钟Serverless实践"系列文章中,我们介绍了什么是Serverless,以及如何构建一个无服务器的图片鉴黄Web应用,本文将延续这个话题,以敏感词过滤为例 ...

  4. 敏感词过滤的php代码,php实现敏感词过滤(Trie树)

    灵感来自于 [嘉兴ing](https://segmentfault.com/a/1190000019137933 "Trie树 php 实现敏感词过滤") 感谢分享. 本文主要是 ...

  5. python敏感词过滤replace_Serverless 实战:3 分钟实现文本敏感词过滤

    敏感词过滤是随着互联网社区一起发展起来的一种阻止网络犯罪和网络暴力的技术手段,通过对可能存在犯罪或网络暴力的关键词进行有针对性的筛查和屏蔽,能够防患于未然,将后果严重的犯罪行为扼杀于萌芽之中. 随着各 ...

  6. 5分钟搞定敏感词过滤!

    函数工作流(FunctionGraph,FGS)是一项基于事件驱动的函数托管计算服务,托管函数具备以毫秒级弹性伸缩.免运维.高可靠的方式运行.通过函数工作流,开发者无需配置和管理服务器,只需关注业务逻 ...

  7. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)...

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  8. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  9. PHP实现敏感词过滤系统

    PHP实现敏感词过滤系统 安装说明 安装PHP扩展 trie_filter,安装教程 http://blog.41ms.com/post/39.html 安装PHP扩展 swoole,安装教程 htt ...

  10. AC自动机:多模式串匹配实现敏感词过滤

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 敏感词过滤场景 在很多支持用户发表内容的网站,都有敏感词过滤替换的功能.例如将一些淫秽.反动内容过滤 ...

最新文章

  1. HotSpot源码(一):Docker与虚拟机的区别,class字节码解析,linux内核源码下载地址,Yacc与Lex快速入门
  2. nginx伪装user-agent等
  3. 单一职责在.NET中
  4. 小白入门机器学习必备:编程语言环境介绍及搭建
  5. python爬虫分析数据_Python爬虫入门 处理数据
  6. 用fuser或者lsof解决无法umount问题(device is busy)
  7. html 在线布局,html布局-管理系统布局
  8. 开启es6——搭建开发环境
  9. undefined reference to `swr_init+
  10. 进阶之路:Java 日志框架全画传(上)
  11. 草根站长的网站推广之路在哪里
  12. SECS/GEM 产品开发和介绍
  13. 菜鸟云打印接入Demo
  14. onenote for windows 10 部分内容不能同步解决方法
  15. 跳板攻击中如何追踪定位攻击者主机(上)
  16. 使用Two.js绘制2D图形的初学者指南
  17. SparkCore入门编程
  18. 拓扑排序——CodeForces-645D
  19. WIN10状态栏添加滑动关机按钮
  20. 仿Bilibili iOS客户端

热门文章

  1. 解决高分辨率屏幕老版软件适配问题
  2. 复变函数知识点整理1-4
  3. outlook 收件箱分组_如何在Mac版Outlook 2016中禁用统一收件箱(和分组文件夹)
  4. Ruby 简单入门(一)
  5. 数学建模层次分析法一致性检验建立
  6. 工作笔记一 --- 坐标点(point)
  7. 麻省理工时域差分软件 MEEP windows 下编译开发(二)——开始编译
  8. 基于STM32单片机和Android的便携式数字示波器设计
  9. haproxy和oracle,IRF虚拟化技术介绍
  10. Fedora 阿里云源