7.Filter过滤器

概念:当访问服务器资源的时候,过滤器可以将请求拦截下来,完成一些特殊的功能;如:登录验证、统一编码处理、敏感字符过滤

步骤:

  1. 定义一个类,实现接口Filter

  2. 复写方法

  3. 配置拦截路径

    1. web.xml

       <filter>
           <filter-name>filterDemo</filter-name>
           <filter-class>filter.FilterDemo</filter-class>
       </filter>
       <filter-mapping>
           <filter-name>filterDemo</filter-name>
           <url-pattern>/demo</url-pattern>
       </filter-mapping>
      
    2. 注解 @WebFilter(“/*”) //访问所有资源之前,都会执行改过滤器

生命周期方法:

  1. init:在服务器启动后,会创建Filter对象,然后调用init方法,只执行一次。用于加载资源
  2. doFilter:每一次请求被拦截资源时,会执行。可以执行多次
  3. dostroy:在服务器关闭后,Filter对象被销毁。如果服务器正常关闭,则会执行destroy方法。只执行一次,用于释放资源

拦截路径常用写法:

  1. 具体资源路径:/index.jsp 只有访问index.jsp资源时,过滤器才会被执行
  2. 拦截目录:/user/* 访问/user下的所有资源时,过滤器才会执行
  3. 后缀名拦截:*.do 访问所有后缀名为.do资源时,过滤器才会执行
  4. 拦截所有资源:/* 访问所有资源时,过滤器都会拦截

拦截方式配置:

  1. 注解配置:

    1. 设置dispatcherTypes属性

      1. REQUEST:默认值。浏览器直接请求的资源

      2. FORWARD:转发访问资源

      3. INCLUDE:包含访问资源

      4. ERROR:错误跳转资源

      5. ASYNC:异步访问资源

      6. @WebFilter(value = "/*",dispatcherTypes = DispatcherType.FORWARD)
        @WebFilter(value = "/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}) //支持多种方式
        
  2. web.xml配置

    1. <filter>
          <filter-name>filterDemo</filter-name>
          <filter-class>filter.FilterDemo</filter-class>
      </filter>
      <filter-mapping>
          <filter-name>filterDemo</filter-name>
          <url-pattern>/demo</url-pattern>
          <dispatcher>REQUEST</dispatcher>
      </filter-mapping>
      

过滤器链(配置多个过滤器):

  1. 执行顺序:如果有两个过滤器:过滤器1和过滤器2
    1. 过滤器1
    2. 过滤器2
    3. 资源执行
    4. 过滤器2
    5. 过滤器1

过滤器先后顺序:

  1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
    1. 如:Afilter和Bfilter,Afilter先执行
  2. web.xml配置:谁定义在上边,谁先执行

增强对象的方式:

  1. 装饰模式

  2. 代理模式:

    1. 概念:

      1. 真实对象:被代理的对象
      2. 代理对象:
      3. 代理模式:代理对象代理真实对象,达到增强真实对象的目的
    2. 实现方式:

      1. 静态代理:有一个类文件描述代理模式

      2. 动态代理:在内存中形成代理类

        1. 实现步骤:
          1. 代理对象和真实对象实现相同的接口
          2. 代理对象 = Proxy.newProxyInstance()
          3. 使用代理对象调用方法
        2. 增强方式:
          1. 增强参数列表
          2. 增强返回值类型
          3. 增强方法体执行逻辑
      3. package filter;
        
        import javax.servlet.*;
        import javax.servlet.annotation.WebFilter;
        import javax.servlet.http.HttpServlet;
        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(value = "/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD}) //访问所有资源之前,都会执行改过滤器
        public class FilterDemo implements Filter {
        
            private List<String> list = new ArrayList<String>(); //敏感词汇集合
        
            @Override
            public void init(FilterConfig filterConfig) throws ServletException {
                try {
                    //获取文件真实路径
                    ServletContext servletContext = filterConfig.getServletContext();
                    String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
                    //读取文件
                    BufferedReader br = new BufferedReader(new FileReader(realPath));
                    //将文件的每一行数据添加到list中
                    String line = null;
                    while ((line = br.readLine()) != null) {
                        list.add(line);
                    }
                    br.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        
            @Override
            public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                //1.创建代理对象,增强getParameter方法
                HttpServlet req = (HttpServlet) servletRequest;
        
                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方法
                        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;
                        }
                        return method.invoke(req, args);
                    }
                });
        
                filterChain.doFilter(proxy_req, servletResponse);
            }
        
            @Override
            public void destroy() {
                Filter.super.destroy();
            }
        }
        
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值