提交的表单数据,常常要检查有没有敏感词汇,如果有,需要给出提示,或者替换为*。

检查、替换敏感词汇有3种常用的方式

(1)在Servlet中操作。

(2)在Filter中先检查。如果要替换敏感词汇,request没有setParameter()方法重新设置请求参数,怎么向Servlet中传递替换后的请求参数?使用request.setAttribute()把这些修改后的请求参数放到request域中即可。

(3)在Filter中创建request的代理,增强getParameter()方法,然后传入代理: chain.doFilter(request的代理对象 resp); 。如何增强getParameter()方法?getParameter()不是要返回一个String吗,先调用原来的getParameter()获取值,检查值中是否有敏感词汇,有就替换掉敏感词汇,返回替换后的值,没有敏感词汇就返回原值。

(1)、(2)较简单,但很繁琐,(3)最常用。此处只演示(3)。

敏感词汇

敏感词汇很多,可以存储在数据库中,也可以存储在文本文件中。

此处我们在项目根目录下新建文件夹resource,标识为资源根目录。resource下新建 illegal_word.txt 存储敏感词汇,一行一个。

  1. 煞笔
  2. 制杖
  3. cxk

每次都从数据库读或文件取读敏感词汇,会增加时间开销,可以把取敏感词汇放到ServletContext中,全局共享、随时可用。

怎么放?Filter的init()方法在Filter生命周期中只调用一次,可以在init()中读取敏感词汇,将敏感词汇放到ArrayList<String>中,再将这个list放到ServletContext中,这样避免了每访问一次就读取一次的问题。

表单

  1. <form action="handlerServlet" method="post">
  2. 评论:<textarea name="comment" rows="10" cols="50"></textarea>
  3. <button type="submit">提交</button>
  4. </form>

Filter

  1. @WebFilter("/handlerServlet")
  2. public class HandlerFilter implements Filter {
  3. public void destroy() {
  4. }
  5.  
  6. public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
  7. //解决中文乱码
  8. req.setCharacterEncoding("utf-8");
  9. resp.setContentType("text/html;charset=utf-8");
  10.  
  11.   //jdk动态代理  
  12. ClassLoader classLoader = req.getClass().getClassLoader();
  13. Class<?>[] interfaces = req.getClass().getInterfaces();
  14. //创建InvocationHandler接口的实例。此处使用匿名内部类来创建
  15. InvocationHandler invocationHandler = new InvocationHandler() {
  16. @Override
  17. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  18. //只增强getParameter()
  19. if(method.getName().equals("getParameter")){
  20. //调用原有的getParameter()获取参数值
  21. String text = (String) method.invoke(req, args);
  22.  
  23. //检查是否有敏感词汇
  24. Object obj = req.getServletContext().getAttribute("illegal_word_list");
  25. ArrayList<String> list=(ArrayList<String>)obj;
  26. for (String word : list){
  27. if (text.contains(word)){
  28. //用一个*替换一个字符
  29. String replac="";
  30. for(int i=0;i<word.length();i++){
  31. replac+="*";
  32. }
  33. //替换所有匹配
  34. text = text.replaceAll(word, replac);
  35. }
  36. }
  37.  
  38. return text;
  39. }
  40.  
  41. //如果调用的是getParameter(),执行到前面的return就结束了,不会执行到此
  42. //如果调用的不是getParameter(),就调用原方法,不做修改
  43. Object returnValue=method.invoke(req,args); //调用目标方法
  44. return returnValue;
  45. }
  46. };
  47.  
  48. //创建req的代理对象
  49. Object proxyInstance = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
  50. //强转为ServletRequest
  51. ServletRequest reqProxyInstance = (ServletRequest) proxyInstance;
  52.  
  53. //传入req的代理对象
  54. chain.doFilter(reqProxyInstance, resp);
  55. }
  56.  
  57. public void init(FilterConfig config) throws ServletException {
  58. InputStream is= this.getClass().getResourceAsStream("/illegal_word.txt");
  59. //因为要readLine()一行一行地读,需要使用BufferedReader流,所以先转换为Reader,再加Buffer
  60. InputStreamReader isr = new InputStreamReader(is);
  61. BufferedReader br = new BufferedReader(isr);
  62. ArrayList<String> list=new ArrayList<>();
  63. String str=null;
  64. while (true){
  65. try {
  66. str=br.readLine();
  67. if (str!=null)
  68. list.add(str);
  69. else
  70. break;
  71. } catch (IOException e) {
  72. e.printStackTrace();
  73. }
  74. }
  75.  
  76. //放到ServletContext中
  77. config.getServletContext().setAttribute("illegal_word_list",list);
  78. }
  79.  
  80. }

测试用的Servlet

  1. @WebServlet("/handlerServlet")
  2. public class HandlerServlet extends HttpServlet {
  3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. String comment = request.getParameter("comment");
  5. response.getWriter().write(comment);
  6. }
  7.  
  8. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  9. doPost(request,response);
  10. }
  11. }

效果

这种方式是增强getParameter(),通过getParameter()获取参数值时,都会先自动检测是否有敏感词汇。

JavaWeb 过滤敏感词汇的更多相关文章

  1. java过滤敏感词汇

    前言 现在几乎所有的网站再发布带有文字信息的内容时都会要求过滤掉发动的.不健康的.影响社会安定的等敏感词汇,这里为大家提供了可以是现在这种功能的解决方案 第一种方式 创建敏感词汇文件:首先需要准备一个 ...

  2. Filter - 过滤敏感词汇(动态代理)

    /** * 敏感词汇过滤器 */ @WebFilter("/*") public class SensitiveWordsFilter implements Filter { pu ...

  3. Java过滤敏感词语/词汇---DFA算法

    最近网站需要在评论.投稿等地方过滤敏感词汇,于是在网上查找了相关教程,特此整理分享. 关于DFA算法,详细的可以去http://blog.csdn.net/u013378306/article/det ...

  4. PHP+Ajax判断是否有敏感词汇

    本文讲述如何使用PHP和Ajax创建一个过滤敏感词汇的方法,判断是否有敏感词汇. 敏感词汇数组sensitive.php return array ( 0 => '111111', 1 => ...

  5. JavaWeb 之 Filter 敏感词汇过滤案例

    需求: 1. 对day17_case案例录入的数据进行敏感词汇过滤 2. 敏感词汇参考 src路径下的<敏感词汇.txt> 3. 如果是敏感词汇,替换为 *** 分析: 1. 对reque ...

  6. js过滤检测敏感词汇

    html: <textarea rows="10" cols="100" id="myDiv"></textarea> ...

  7. web前端js过滤敏感词

    web前端js过滤敏感词 这里是用文本输入框还有文本域绑定了失去焦点事件,然后再遍历敏感词数组进行匹配和替换. var keywords=["阿扁","呵呵", ...

  8. php 过滤敏感关键词

    php 过滤敏感关键词 function badwords($content){ $keywords=M("config")->where("name='badwo ...

  9. (转)两种高效过滤敏感词算法--DFA算法和AC自动机算法

    原文:https://blog.csdn.net/u013421629/article/details/83178970 一道bat面试题:快速替换10亿条标题中的5万个敏感词,有哪些解决思路? 有十 ...

随机推荐

  1. 201871020225-牟星源《面向对象程序设计(java)》第十周学习总结

    201871020225-牟星源<面向对象程序设计(java)>第十周学习总结 博文正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu- ...

  2. Maven的Scope区别笔记

    依赖的Scopescope定义了类包在项目的使用阶段.项目阶段包括: 编译,运行,测试和发布. 分类说明compile 默认scope为compile,表示为当前依赖参与项目的编译.测试和运行阶段,属 ...

  3. Linux学习笔记-第3天 - 勤能补拙

    学一门技术,基础一定要打牢,多练习是关键,还要尽可能理解其背后的知识.并时刻提醒自己,求知若饥,虚心若愚.

  4. css3中@font-face模块自定义字体

    一.@font-face模块介绍 @font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,在Web的开发中使用字体不再只能使用W ...

  5. Spring 常用配置、Bean

    spring模块 Spring-Core: Core包是框架的最基础部分,并提供依赖注入(Dependency Injection)管理Bean容器功能. Spring-Context:(Spring ...

  6. opera11以下添加搜索引擎的办法

    opera11以下:首选项,搜索引擎设置添加搜索引擎,地址是https://www.baidu.com/s?wd=%s 这是从其他浏览器里面得到的. opera11以上: http://www.bai ...

  7. coreml之通过URL加载模型

    在xcode中使用mlmodel模型,之前说的最简单的方法是将模型拖进工程中即可,xcode会自动生成有关模型的前向预测接口,这种方式非常简单,但是更新模型就很不方便. 今天说下另外一种通过URL加载 ...

  8. Linux性能优化实战学习笔记:第三十二讲

    一.上节总结 专栏更新至今,四大基础模块的第三个模块——文件系统和磁盘 I/O 篇,我们就已经学完了.很开心你还没有掉队,仍然在积极学习思考和实践操作,并且热情地留言与讨论. 今天是性能优化的第四期. ...

  9. [LeetCode] 347. Top K Frequent Elements 前K个高频元素

    Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...

  10. 2019 SDN上机第2次作业

    1.利用mininet创建如下拓扑,要求拓扑支持OpenFlow 1.3协议,主机名.交换机名以及端口对应正确,请给出拓扑Mininet执行结果,展示端口连接情况 1.1拓扑 1.2 代码 #!/us ...