JavaWeb案例--过滤敏感词汇

160 阅读2分钟

结合Filter过滤器来完成对敏感词汇的过滤。

  • 需求:

    1. 对day17_case案例录入的数据进行敏感词汇过滤
    2. 敏感词汇参考《敏感词汇.txt》
    3. 如果是敏感词汇,替换为 ***
  • 分析:

    1. 对request对象进行增强。增强获取参数相关方法
    2. 放行。传递代理对象

先准备好 敏感词汇.txt ,并将其放在src目录下

image.png

Filter的具体实现文件 SensitiveWordsFilter.java

在将“敏感词汇.txt”写入时的目录问题,需要格外关注(因为我就是在这里犯错并耗费了不少精力)

即:在src目录下的文件路径应写为"/WEB-INF/classes/文件名"

package com.sun.web.filter;

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.ArrayList;
import java.util.List;

@WebFilter("/*")
public class SensitiveWordsFilter implements Filter {
    //创建敏感词汇集合
    private List<String> list = new ArrayList<String>();
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        try {
            //1、获取文件的真实路径
            ServletContext servletContext = filterConfig.getServletContext();
            // String realPath = servletContext.getRealPath("src/敏感词汇.txt");
            //注意:在src目录下的文件路径应写为"/WEB-INF/classes/文件名"
            String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
            //2、读取文件
            BufferedReader br = new BufferedReader(new FileReader(realPath));
            //3、将文件的每一行数据添加到list中
            String line = null;
            while ((line = br.readLine()) != null){
                list.add(line);
            }
            br.close();
            System.out.println(list);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        filterChain.doFilter(servletRequest, servletResponse);
        //1、创建代理对象,增强getParameter方法
        ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(servletRequest.getClass().getClassLoader(), servletRequest.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //增强getParameter方法
                //判断是否是getParameter方法
                if(method.getName().equals("getParameter")){
                    //增强返回值
                    //获取返回值
                    String value = (String) method.invoke(servletRequest, args);
                    if (value != null){
                        for (String str : list){
                            if (value.contains(str)){
                                value = value.replaceAll(str, "***");
                            }
                        }
                    }
                    return value;
                }
                return method.invoke(servletRequest, args);
            }
        });
        //2、放行
        filterChain.doFilter(proxy_req, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

项目实现文件 TestServlet.java

package com.sun.web.servlet;

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("/testServlet")
public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        String msg = req.getParameter("msg");

        System.out.println(name+":"+msg);
    }

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

开启tomcat,访问页面。我是本地的tomcat,且端口为8080,虚拟路径为/day19

故在访问的链接写入:

localhost:8080/day19/testServlet?name=张三&msg=1笨蛋2坏蛋

在控制台输出为 张三:1***2***