首页 > 编程知识 正文

Filter 敏感词汇过滤案例

时间:2023-05-03 07:22:56 阅读:215452 作者:1518

文章目录 一、需求分析二、案例实现

一、需求分析 (1)对案例录入的数据进行敏感词汇过滤(2)敏感词汇参考敏感词汇.txt(3)如果是敏感词汇,替换为 ***


可以确定 Filter 和 servlet 中的 request 是同一个 request,但是为了实现过滤器的作用,需要对获得参数进行修改设置,所以需要对 request 对象的 getParameter 方法进行增强。

二、案例实现

这里建立个试验传递非法参数,检验过滤效果

@WebServlet("/testServlet")public class TestServlet extends HttpServlet { 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); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); }}

敏感词过滤:SensitiveWordsFilter.java

/** * 敏感词汇过滤器 */@WebFilter("/*")public class SensitiveWordsFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println("敏感词过滤。。。"); //1.创建代理对象,增强getParameter方法 ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.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(req, args); if (value != null) { for (String str : list) { if (value.contains(str)) { value = value.replaceAll(str, "***"); } } } return value; } //判断方法名是否是 getParameterMap //判断方法名是否是 getParameterValue return method.invoke(req, args); } }); //2.放行 chain.doFilter(proxy_req, resp); } private List<String> list = new ArrayList<String>();//敏感词汇集合 public void init(FilterConfig config) throws ServletException { System.out.println("init...."); try { //1.获取文件真实路径 ServletContext servletContext = config.getServletContext(); // 注意这里 a.txt 文档存储的是 gbk 格式的中文,否则将乱码 String realPath = servletContext.getRealPath("/WEB-INF/classes/a.txt"); //2.读取文件 BufferedReader br = new BufferedReader(new FileReader(realPath)); //3.将文件的每一行数据添加到list中 String line = null; while ((line = br.readLine()) != null) { list.add(line); } System.out.println(list); br.close(); } catch (Exception e) { e.printStackTrace(); } } public void destroy() { }}

这里注意敏感词文件中如果有中文需要改成 gbk 编码,和BufferedReader对应,这样才不至于乱码

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。