Filter的使用场景:敏感词过滤

在这里插入图片描述
案例说明:在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;
    }

    @Override
    public 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获取请求消息,控制台输出:
在这里插入图片描述

发布了48 篇原创文章 · 获赞 18 · 访问量 2961

猜你喜欢

转载自blog.csdn.net/qq_45615417/article/details/104170893