Filter - 通过拦截器与动态代理实现敏感词汇过滤

需求:将敏感词汇.txt文件中的词语过滤为 -> "***"

分析:

首先加载文档,将文档中的词汇纳入集合中备用,方便后期比对使用。

使用Proxy动态代理将request对象的getParameter方法增强,使用反射得到getParameter方法中的字符串(从请求中带来的),与前面提取出来的敏感词汇进行对比 - 判断,最后返回覆盖敏感词汇的字符串,覆盖getParameter方法。

将放行中的request对象替换为Proxy返回的proxy_req

实现:

package cn.xxx.web.filter;
/**
 * Created by 加班狂人 on 2022/7/18 9:40
 */

import javax.servlet.*;
import javax.servlet.annotation.*;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
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 SensitiveWordFilter implements Filter {

    private List<String> list = new ArrayList<String>();//敏感词汇集合
    public void init(FilterConfig config) throws ServletException {
        try {
            //获取文件真实路径
            ServletContext servletContext = config.getServletContext();
            String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
            //读取文件
            BufferedReader bf = new BufferedReader(new FileReader(realPath));
            //将文件的每一行数据都加入到list中
            String line = null;
            while ((line = bf.readLine()) != null){
                list.add(line);
            }
            bf.close();
            System.out.println(list);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        //创建代理对象,增强getParameter方法
        ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //增强getParameter方法
                if ("getParameter".equals(method.getName())){
                    //增强返回值
                    String value = (String) method.invoke(request,args);
                    if (value != null){
                        for (String str : list) {
                            if (value.contains(str)){
                                //说明包含敏感词汇
                                value = value.replaceAll(str,"***");
                            }
                        }
                    }
                    return value;//覆盖getParameter
                }

                return method.invoke(request,args);
            }
        });

        //放行

        chain.doFilter(proxy_req, response); //将放行对象换成 req

    }
}

通过写一个简单的servlet来测试一下:

package cn.xxx.web.servlet; 
/**
 * Created by 加班狂人 on 2022/7/18 10:18
 */

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "TestServlet", value = "/testServlet")
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String msg = request.getParameter("msg");

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

测试结果:启动tomcat服务器,在地址栏访问testServlet并加上敏感词汇

http://localhost:8080/case/testServlet?name=王五&msg=莎碧

王五:***

太暴力就不演示了,很难过审

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OtnIOs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值