# Filter 概述

web 中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

过滤器的作用:一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…

# 使用 Filter

# 实现接口 Filter

定义一个类,实现接口 Filter

# 复写方法

doFilter :每一个请求被拦截资源时,会执行,执行多次

放行: chain.doFilter(req,res);

init :在服务器启动后,会创建 Filter 对象,然后调用 init 方法。只执行一次。用于加载资源

destroy :在服务器关闭后,Filter 对象被销毁。如果服务器是正常关闭,则会执行 destroy 方法。只执行一次。用于释放资源

# 配置拦截路径

# web.xml

<!-- 设置拦截路径 -->
<filter>
    <filter-name>demo1</filter-name>
    <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
    <filter-name>demo1</filter-name>
    <!-- 拦截路径 -->
    <url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 设置 dispatcherTypes -->
<dispatcher></dispatcher>

# 注解配置

@WebFilter("/*")

value 属性

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

dispatcherType 属性

  1. DispatcherType.REQUEST :默认值。浏览器直接请求资源
  2. DispatcherType.FORWARD :转发访问资源
  3. DispatcherType.INCLUDE :包含访问资源
  4. DispatcherType.ERROR :错误跳转资源
  5. DispatcherType.ASYNC :异步访问资源
  6. 多个参数用大括号包裹

# 过滤器执行过程

  1. 执行过滤器
  2. 执行放行后的代码
  3. 回来执行过滤器

# 过滤器链

# 执行顺序

如果有两个过滤器:过滤器 1 和过滤器 2

  1. 过滤器 1
  2. 过滤器 2
  3. 资源执行
  4. 过滤器 2
  5. 过滤器 1

# 过滤器先后顺序问题

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

# 增强对象功能

设计模式:一些通用的解决固定问题的方式

# 装饰模式

不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象

# 代理模式

# 概念

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

# 实现方式

  1. 静态代理:有一个类文件描述代理模式
  2. 动态代理:在内存中形成代理类
    1. 实现步骤:
      1. 代理对象和真实对象实现相同的接口
      2. 代理对象 = Proxy.newProxyInstance ();
      3. 使用代理对象调用方法
      4. 增强方法
    2. 增强方式:
      1. 增强参数列表
      2. 增强返回值类型
      3. 增强方法体执行逻辑
String str = new String();
/*
    1. 真实对象
    2. 接口数组
    3. 处理器:new InvocationHandler ()
*/
String str2 = (String) Proxy.newProxyInstance(str.getClass().getClassLoader().getClass().getClassLoader(), str.getClass().getInterfaces(), new InvocationHandler() {
/*
    代理逻辑编写的方法:代理对象所有的方法都会被执行
    参数:
        1. proxy:代理对象
        2. method:代理对象调用的方法,被封装为对象 (反射)
        3. args:方法执行时,传递的参数
*/
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 使用真实对象调用方法
        return method.invoke(str,args);
    }
});
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Baozi 微信支付

微信支付

Baozi 支付宝

支付宝

Baozi 微信

微信