Filter过滤器基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31071543/article/details/81670531

一:Filter简介
Filter被称为过滤器,web开发人员通过Filter技术,可以对web服务器管理的所有web资源进行拦截如:对JSP、servlet、静态图片、静态HTML等,从而实现一些特殊功能。常见的filter应用有:图片的压缩响应、统一前后端字符编码格式、敏感词汇过滤等。
ServletAPI提供了Filter接口,创建一个类实现Filter接口,则把这个java类称之为过滤器。通过Filter技术,可以实现用户在访问某个资源之前,对请求与响应做相应的拦截处理。
这里写图片描述
二:Filter如何实现拦截
当创建一个Filter实现类后,我们需要配置需要被拦截的目标web资源路径。web服务器每次调用web目标资源时,需要先调用Filter实现类中的doFilter方法,通过doFilter方法中编写业务逻辑,我们可以实现如下功能:
1:调用目标资源前,实现相关代码逻辑
2:目标资源是否能被调用,即用户是否能访问目标资源
3:调用目标资源后,实现相关代码逻辑
在doFilter方法中会传递一个filterChain参数,FilterChain是filter中比较重要的一个对象。通过执行chain.doFilter(request,response),才能继续访问servlet的service方法,否则目标资源不能被访问。

三:Filter开发入门
3.1:Filter开发步骤
1:创建一个类实现Filter接口,并覆写doFilter方法
2:Filter注册

  <!-- 注册过滤器 -->
    <filter>
    <!--用于为过滤器指定一个名字,元素内容不能为空 -->
    <filter-name>CharacterEncodingFilter</filter-name>
    <!-- 指定过滤器完整的全路径 -->
    <filter-class>com.lx.study.filter.filter.CharacterEncodingFilter</filter-class>
    <!-- 配置过滤器的初始化参数,在过滤器中可以通过FilterConfig的相关方法获取初始化参数 -->
    <init-param>
       <!-- 初始化参数名 -->
      <param-name>encoding</param-name>
       <!-- 初始化参数值 -->
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>

3:映射Filter

<!-- 映射拦截器 -->
  <filter-mapping>
    <!-- 拦截器名称,与对应注册过滤器中的filer-name相同 -->
    <filter-name>CharacterEncodingFilter</filter-name>
    <!-- 设置过滤器需要拦截的资源 -->
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
  </filter-mapping>

<dispatcher>设置的值及其意义:
REQUEST 当用户直接访问页面,web容器将会调用过滤器。但通过RequstDispatcher的include()与forward()访问时,不会调用过滤器
INCLUDE 只有通过RequestDispatcher的include()方法访问目标资源,才会触发过滤器
FORWARD 只有通过RequestDispatcher的forward()方法访问目标资源,才会触发过滤器
ERROR 只有目标资源通过声明式异常处理机制调用,才会触发这个过滤器

3.2:Filter链
在一个javaWeb项目中可能存在多个Filter实现类,这些Filter实现类就称为Filter链。Web服务器通过拦截器的注册顺序,来判断拦截器的执行顺序。每次执行doFilter方法中的chain.doFilter时,会在内部判断当前是否为最后一个filter,如果往下还存在filter,则会继续向下执行下一个Filter的doFilter方法,否则访问目标资源。

四:Filter的生命周期
4.1:Filter的创建
Web应用启动后,Web服务器会创建所有Filter的实例对象,并调用对应init方法完成拦截器初始化。只有在web应用启动时,才会创建Filter实例对象与执行init方法。通过init方法参数可以获得当前Filter配置信息FilterConfig对象
4.2:Filter的拦截
在调用目标Servlet的service方法之前,会调用拦截器的doFilter方法。
4.3:Filter的销毁
通过Filter的destroy方法销毁Filter,在拦截器的整个生命周期中,只会执行一次。在destroy方法中释放拦截器占用的资源。

猜你喜欢

转载自blog.csdn.net/qq_31071543/article/details/81670531