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