动态代理实现过滤敏感词汇变成***

大家好,我是一名入门的菜鸟,如果你不经意间翻开了我的文章,谢谢您,您的支持是我前进的动力,让我们一起加油!!
由于不是名牌大学,只是一个普普通通的专科生,所以,我想通过自己的努力来获得我想要的,我不会放弃我的梦想,我也曾幻想着我成功的时候在朋友边吹嘘,也曾想象到我失败时候潦倒的样子,幻想始终是幻想,我会努力的,加油,你一定能行

首先,使用动态代理最重要的是要找到要增强的方法,找到目标,目标明确了才能		
进行下一步,我是在过滤器中进行动态代理的

我们首先要确定一件事,就是过滤器中的request是否和Servlet里的是不是同一	
个,我们既然要进行过滤敏感词汇,变成***,就得让Filter和Servlet中的request里
的	内容保持一致,也就是过滤器中进行了request域的更新,Servlet也要跟着进
行更新.

这样,就得用到了动态代理,对getParameter方法进行增强,能把从文件中读取掉
的敏感词汇和原本request域中(用户输入的值)进行对比,如果包含的有,就进行
替换,然后把更新后的值在用一个新的request接收这个返回的代理对象(也就是
返回的更改过后的值)

进行放行(这时,request域中已经更新完成,和Servlet中的request域中存的值保
持了一致)

效果图

动态代理实现过滤敏感词汇变成***_第1张图片

这是文件的目录结构
动态代理实现过滤敏感词汇变成***_第2张图片
我把所有的敏感词汇都存进了一个txt文件中,并放在了src目录下
动态代理实现过滤敏感词汇变成***_第3张图片
下面代码展示:
Filter:

package com.aoshen.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;

@WebFilter("/*")
public class Demo01Filter implements Filter {
    //创建集合
    private ArrayList<String>list = new ArrayList<>();
    public void init(FilterConfig config) throws ServletException {
        //获取文件中的敏感词汇
        //首先获取文件的字节输入流对象
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("words.txt");
        //转换成字符输入流
        //因为是一次读一行,转换成字符缓冲流
        try (BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));){
            //循环读取
            String len = null;
            while ((len = br.readLine())!=null){
                //添加到集合中
                list.add(len);
            }
            System.out.println(list);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //获取提交方式
        HttpServletRequest request = (HttpServletRequest) req;
        String method = request.getMethod();
        if(method.equals("POST")){
            //设置编码
            request.setCharacterEncoding("utf-8");
        }

        //使用动态代理进行增强
        //1:创建代理对象,对getParameter进行增强
        ServletRequest request1 = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                //2:对getParameter方法进行增强,首先判断是否是getParameter方法
                if (method.getName().equals("getParameter")) {
                    //3:对返回值进行增强
                    //req:域里面存着用户输入的数据
                    String value = (String) method.invoke(req, args); //这里的返回值就是用户输入的值
                    //4:判断是否为空
                    if (value != null) {
                        //5:不等于空,循环遍历list集合里的内容
                        for (String s : list) {
                            //6:如果用户输入的数据包含敏感词汇就替换成***
                            if (value.contains(s)) {
                                value = value.replaceAll(s, "***");
                            }
                        }
                    }
                    return value;
                }

                //当用户使用getParameter之外的方法时,不增强,还是原来的方法
                return method.invoke(req, args);
            }
        });
        //放行的是更新之后的request,这个request域中存的才是最新的值
        chain.doFilter(request1, resp);
    }

    public void destroy() {
    }

}

Servlet:

package com.aoshen.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;
import java.io.PrintWriter;

@WebServlet(value = "/Demo01Servlet")
public class Demo01Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //获取文本框内容
        String message = request.getParameter("message");
        out.print(message);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

JSP:


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>把敏感词汇编程***</title>
  </head>
  <body>
  <form method="post" action="Demo01Servlet">
    发贴:<input type="text" name="message"> <input type="submit" value="提交">
  </form>
  </body>
</html>

你可能感兴趣的:(JavaWeb)