26-Illegal character filtering

Insert picture description here

2. Thinking analysis

1. Create a form for making comments.

2. Create a txt file in which illegal characters are stored. (It is convenient to expand the sensitive vocabulary in the future)

3. Create a Filter to intercept requests. In the init method, the illegal characters in the txt file are read into the memory.

4. Get the parameters in the request, and check the requested parameters for illegal characters in ms.

5. If the speech does not contain illegal characters, let it go.

6. If the speech contains illegal characters, block it and prompt the user to speak illegally.

Insert picture description here

3. The code implements
WordFilter


package com.itheima.filter.k_demo敏感词汇;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

//由于这个过滤器仅仅是针对发表内容的过滤,所以它的映射路径只要捕获发表的servlet即可
@WebFilter("/publish")
public class WordFilter implements Filter {
//准备装敏感词汇的容器
List<String> wordlist = new ArrayList<>();

//只会执行一次
@Override
public void init(FilterConfig filterConfig) throws ServletException {
    try {
        System.out.println("敏感词汇过滤器::init~!");

        //读取文件,得到每一个词汇,然后装到容器中。
        //a. 要一行一行的读取。BufferedReader , readLine()
        //b. 需要一个参数,reader
        //c. 目前只有一个文件 IllegalWords.txt ---> 输入流
        //d. 可以借助一个转换器 inputstreamreader(inputstream)  转换得到reader对象

        //读取文件,转换成输入流,一般在web项目里面不建议使用new FileInputStream的写法
        String path = filterConfig.getServletContext().getRealPath("");
        //System.out.println("path=" + path);
        InputStream is = filterConfig.getServletContext().getResourceAsStream("IllegalWords.txt");

        System.out.println("is==" + is);

        //把输入流转化成一个包装的reader对象,主要是为了方便读取每一行,因为一行就是一个敏感词汇
        BufferedReader reader = new BufferedReader(new InputStreamReader(is , "utf-8"));

        String line ;
        //循环的读取每一行,读取到的每一行都赋值给上面的line对象。如果读到的是null 表示读到末尾了。
        while( (line = reader.readLine()) != null){
            System.out.println("line==" + line);
             wordlist.add(line);
        }
        reader.close();/**/
    } catch (Exception e) {
        e.printStackTrace();
    }

}
    //会执行很多次,拦截到多少次请求,就执行多少次
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("敏感词汇过滤器::doFilter~!");

        //1. 对发表的内容进行检查
        // a. 知道发表的是什么内容
        String message = servletRequest.getParameter("message");


        // b. 读文件,获取到敏感词汇库,校验发表的内容是否含有敏感词汇。
        for( String word : wordlist){

            //判定发表的消息是否有敏感词汇
            if(message .contains(word)){
                //2. 如果有敏感词汇, 让敏感词汇变成*
                message = message.replace(word , "***");
            }
        }
        //3. 把这个修改好的内容存储到作用域中
        servletRequest.setAttribute("msg", message);

        //4. 放行,让请求到达servlet,以便内容能够发表出来
        filterChain.doFilter(servletRequest ,servletResponse);
    }

    @Override
    public void destroy() {
        System.out.println("敏感词汇过滤器::destroy~!");

    }
}

PublishServlet

package com.itheima.filter.k_demo敏感词汇;

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;

@WebServlet("/publish")
public class ServletDemo  extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1. 获取到要发表的言论
        //String message = req.getParameter("message");
        String message = (String)req.getAttribute("msg");

        //2. 直接写到页面上: 您发布的内容是: xxxx
        resp.getWriter().write("您发布的内容是:"+ message);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req ,resp);
    }
}

4. Summary

  1. Ideas
    • init()
      • Read the illegal character file and save the illegal character string to List [You only need to read it once, init() is executed once]
    • doFilter() method
      • Force two parameters
      • Obtain user comments
      • Traverse the List collection to determine whether the user’s comments contain illegal characters
        • If included, block, respond to'posted speech contains illegal characters, repost'
        • Not included, let go
  2. Precautions
    • Read illegal character file specified utf-8

Insert picture description here

Guess you like

Origin blog.csdn.net/weixin_aqing/article/details/112559316