动态代理小案例:增强request.getParameter();方法过滤非法字符

需求:传到服务器之前就让过滤器将非法字符转成*

前端显示部分:
在这里插入图片描述
过滤效果:
在这里插入图片描述
过滤器:
将脏话字符放到文本里在过滤器init方法读取。
动态代理增强getParameter()方法
过滤链放行代理对象

package com.alibaba.filter;


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author:ZZZ
 * @Date: 2020/12/27 10:02
 * @Version 1.0
 */
//需求:读取文本时传到服务器之前就让非法字符成*
public class IllegalFilter implements Filter {
    List<String> wordsLits=new ArrayList<>();
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
//        读取脏话文本//不用加classpath
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("IllegalWords.txt");
//        字节缓冲流可以一行一行读
        BufferedReader br= null;
        try {
            br = new BufferedReader(new InputStreamReader(is,"utf-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String s="";
        try {
            //!!!这里是while 不断读取 不是if
            while ((s=br.readLine())!=null) {
                wordsLits.add(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//      强转 ,  添加servlet依赖
        HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
        HttpServletResponse httpServletResponse =(HttpServletResponse)servletResponse;
//        导包 java.lang.reflect.Proxy;
        //ClassLoader loader, 被代理类类加载器
        ClassLoader classLoader = httpServletRequest.getClass().getClassLoader();
        //Class<?>[] interfaces, 被代理类接口的Class对象,是接口不是类
        Class<HttpServletRequest> aClass = HttpServletRequest.class;
        //httpServletRequest的动态代理   接口=实现类
        HttpServletRequest httpServletRequest_Proxy = (HttpServletRequest) Proxy.newProxyInstance(classLoader, new Class[]{aClass}, new InvocationHandler() {

            private String params;

            @Override        //代理类对象     被代理类执行的方法   被代理类执行的方法的参数
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if (method.getName().equals("getParameter")) {
//                被代理对象执行方法getParameter获取参数
                    params = (String) method.invoke(httpServletRequest, args);
//                    遍历脏话list
                    for (String words : wordsLits) {
                        if (params.contains(words)) {
//                            用*取代脏话
//                            创建字符串*的长度  *的个数=脏话字数
                            StringBuilder stringBuilder = new StringBuilder();
                            for (int i = 0; i < words.length(); i++) {
                                stringBuilder.append("*");
                            }
//                            !!!记得赋值
                              params= params.replace(words, stringBuilder.toString());
                        }
                    }
//                    代理类执行getParameter的返回值
                    return params;
                }
//                !!!是被代理类执行其他方法的返回值
                return method.invoke(httpServletRequest,args);
//                为什么执行代理对象invoke(proxy,args)会不断循环呢?
//              代理对象执行方法->结果返回代理对象执行方法的返回值(代理对象没有自己的方法,本来要去调用被代理的方法,
//              结果代理对象调用自己的方法,自己调用自己调用自己...
//
            }
        });
//       !!! 放行增强的代理类
        filterChain.doFilter(httpServletRequest_Proxy, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

顺便过滤请求和响应字符编码

  servletRequest.setCharacterEncoding("utf-8");
  servletResponse.setContentType("text/html; charset=UTF-8");
  filterChain.doFilter(servletRequest, servletResponse);

配置过滤器可以用配置文件

<filter>
		<filter-name>IllegalFilter</filter-name>
		<filter-class>com.alibaba.filter.IllegalFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>IllegalFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

也可以用注解配置
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值