其他分享
首页 > 其他分享> > Filter 与 Listener

Filter 与 Listener

作者:互联网

01. Filter

  a. Filter 是一个接口,需要写一个类实现这个接口

    > 接口: javax.servlet 下的 Filter;

    > 在 doFilter中实现过滤,并将符合条件的请求放行:

      >> filterChain.doFilter(servletRequest,servletResponse);

  b. 拦截路径配置

    1. 注解方式

      @WebFilter("/*")

    2. web.xml配置

      

  c. 最简易过滤器下的异常及处理

   > 新建一个 Filter实现类,重载 Filter

   > 启动服务时发现异常

    

   > 异常点识别

    

     > 注释掉默认的 super 调用

    

 

   d. 过滤器的生命周期

    > 一个过滤器,在实现接口时,有三个接口需要实现;

      

 

    > init: 在服务启动后会被自动加载,执行一次;一般用于资源的加载;

    > destroy: 在服务正常关闭销毁时,会自动执行一次;一般用于资源的释放;

    > doFilter: 过滤处理,可以执行多次;基于配置的拦截路径,有业务请求时,都会执行;

   e. 过滤器的执行流程

    

   f. 过滤器配置详解

    1. 拦截路径的配置

      a. 具体资源路径的拦截:   /index.jsp    >>  只有访问 index.jsp期间资源时,过滤器才会被执行;

      b. 目录拦截:   /user/*   访问/user下的所有资源时,过滤器都会被执行;

      c. 后缀名拦截: *.jsp   访问所有后缀名为 .jsp 的资源时,过滤器都会被拦截;

      d. 拦截所有资源:  /*   访问所有资源时,过滤器都会被执行;

    2. 拦截方式配置: 资源被访问的方式

      > 注解配置:

        * 设置 DispatcherType 属性;

          a. REQUEST: 默认值;浏览器直接请求资源;

          b. FORWARD: 转发访问资源;

          c. INCLUDE: 包含访问资源;

          d. ERROR:  错误跳转资源;

          f. ASYNC: 异步访问资源;

        * web.xml配置

           需要配置 <dispatcher>  DispatcherType五种选择 </dispatcher> 标签即可;

  g: 过滤器链( 多个过滤器)

    > 执行顺序:  过滤器1执行 > 过滤器2执行 > 资源执行  > 过滤器2执行 > 过滤器1执行    

    > 多个过滤器执行先后问题

      * 注解配置方式:  按照类名的字符串比较规则比较,值小的先执行;

      * web.xml 配置: <filter-mapping> 谁定义在上边,谁先执行;      

 

 

2.代理

  

 1 public static void main(String[] args) {
 2         //01.创建真实对象
 3         ASUS asus = new ASUS();
 4         //02.创建代理对象
 5         SalePC proxyInstance = (SalePC) Proxy.newProxyInstance(//
 6                 asus.getClass().getClassLoader(),//
 7                 asus.getClass().getInterfaces(),//
 8                 //代理对象调用的所有方法都会调用这个方法
 9                 new InvocationHandler() {
10                     @Override
11                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
12                         //识别方法
13                         if("Sale".equalsIgnoreCase(method.getName())){
14                             //参数增强
15                             Double p = (Double) args[0];
16                             p = p*0.8;
17                             System.out.println("方法体增强:专车接你...");
18                             //传递的是处理后的参数,不再是原参数
19                             String invoke = (String) method.invoke(asus, p);
20                             System.out.println("方法体增强:专车送货...");
21                             //增强返回
22                             invoke = "结果增强: "+ invoke+"_赠送鼠标键盘及鼠标垫";
23                             return invoke;
24                         }else{
25                             Object invoke = method.invoke(asus, args);
26                             return invoke;
27                         }
28                     }
29                 });
30         //03.执行
31         proxyInstance.Show();
32         String sale = proxyInstance.Sale(8000);
33         System.out.println(sale);
34 
35     }

 

 

 

 

标签:Listener,invoke,Filter,过滤器,拦截,执行,资源
来源: https://www.cnblogs.com/jieling/p/16101236.html