Skip to content

Filter过滤器

一、Filter概述

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

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

二、使用Filter

1、实现接口Filter

定义一个类,实现接口Filter

2、复写方法

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

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

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

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

3、配置拦截路径

1)web.xml

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>

2)注解配置

@WebFilter("/*")

value属性

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

dispatcherTypes属性

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

4、过滤器执行流程

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

5、过滤器链

1)执行顺序

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

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

2)过滤器先后顺序问题

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

web.xml配置:谁定义在上边,谁先执行

三、增强对象的功能

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

1、装饰模式

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

2、代理模式

1)概念

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

2)实现方式

  1. 静态代理:有一个类文件描述代理模式
  2. 动态代理:在内存中形成代理类
    1. 实现步骤:
      1. 代理对象和真实对象实现相同的接口
      2. 代理对象 = Proxy.newProxyInstance();
      3. 使用代理对象调用方法
      4. 增强方法
    2. 增强方式:
      1. 增强参数列表
      2. 增强返回值类型
      3. 增强方法体执行逻辑
java
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);
    }
});

Released under the MIT License.