JavaWeb 之 Filter:过滤器

1、Filter 概述

  一、概念

    Filter 过滤器是 JavaWeb 的三大组件之一。(Servlet、Filter、Listener)html

    Filter 过滤器它是 JavaEE 的规范,能够在浏览器以及目标资源之间起到一个过滤的做用,它的做用是:拦截请求,过滤响应。java

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

  二、做用

    拦截请求常见的应用场景有:web

      ① 登陆验证;sql

      ② 权限检查;浏览器

      ③ 事务管理;服务器

      ④ 统一编码处理;app

      ⑤ 敏感字符等等异步

2、使用步骤

  一、定义一个类,实现接口 Filter

  二、实现 doFilter() 方法 

  三、配置拦截路径

    ① web.xml 配置jsp

      格式:

 1 <!--filter 标签用于配置一个 Filter 过滤器-->
 2 <filter>
 3     <!--给 filter 起一个别名-->
 4     <filter-name>AdminFilter</filter-name>
 5     <!--配置 filter 的全类名-->
 6     <filter-class>com.atguigu.filter.AdminFilter</filter-class>
 7 </filter>
 8 <!--filter-mapping 配置 Filter 过滤器的拦截路径-->
 9 <filter-mapping>
10     <!--filter-name 表示当前的拦截路径给哪一个 filter 使用-->
11     <filter-name>AdminFilter</filter-name>
12     <!--  url-pattern 配置拦截路径,能够有多个拦截路径 13     / 表示请求地址为: http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
14     /admin/* 表示请求地址为: http://ip:port/工程路径/admin/* 15  --> 16  <url-pattern>/admin/*</url-pattern> 17  <url-pattern>/client/*</url-pattern> 18 </filter-mapping>

    ② 注解方式配置

       在类上添加 @WebFilter() 便可,里面填写访问所要拦截的资源的路径。

  四、代码实现

 1 import javax.servlet.*;  2 import javax.servlet.annotation.WebFilter;  3 import java.io.IOException;  4 
 5 @WebFilter("/*")  6 public class FirstFilter implements Filter {  7     public void destroy() {  8  }  9     // doFilter 方法,专门用于拦截请求,过滤响应
10     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { 11         System.out.println("filterDemo1被执行了...."); 12         // 放行操做
13  chain.doFilter(req, resp); 14  } 15 
16     public void init(FilterConfig config) throws ServletException { 17 
18  } 19 
20 }

 

   五、Filter 的工做流程图

    

 

3、Filter 的生命周期

  Filter 的生命周期包含几个方法:

  一、构造器方法

      执行时机:在 web 工程启动的时候执行(Filter 会建立)

  二、init 初始化方法

      执行时机:在 web 工程启动的时候,构造方法执行完,马上执行 init 方法,作一些初始化的操做

  三、doFilter 方法

      执行时机:每次访问目标资源时都会调用,每次拦截到请求,就会执行(执行屡次);

  四、destroy 方法

      执行时机:中止 web 工程的时候,就会执行(中止 web 工程,也会销毁 Filter 过滤器),用来释放资源

4、Filter 接口

   Filter 是一个接口,给咱们提供了下面三个方法

   

    Filter 接口,实现 Filter 须要实现该接口。

    (1)init() 方法用于初始化 Filter;

    (2)doFilter() 是过滤请求和响应的主要方法;

    (3)destory() 用于在 Filter 对象被销毁前作收尾工做,如是否资源等;

5、FilterConfig 类

  FilterConfig 类是 Filter 过滤器的配置文件类。

  

  Tomcat 每次建立 Filter 的时候,也会同时建立一个 FilterConfig 类,这里面包含了 Filter 配置文件的配置信息。

  FilterConfig 对象在服务器调用 init() 方法时传递进行。

  FilterConfig 类的做用是获取 filter 过滤器的配置内容:

getFilterName():获取 Filter 的名称 filter-name 的内容;

getSerletContext():获取ServletContext 对象(即 application)

getInitParameter():获取在 Filter 中配置的 init-param 初始化参数;

getInitParameterNames():获取全部初始化参数的名字;

   Demo:

 1 web.xml 的配置:  2  <!--filter 标签用于配置一个 Filter 过滤器-->
 3     <filter>
 4         <!--给 filter 起一个别名-->
 5         <filter-name>AdminFilter</filter-name>
 6         <!--配置 filter 的全类名--><filter-class>com.atguigu.filter.AdminFilter</filter-class>
 7         <init-param>
 8             <param-name>username</param-name>
 9             <param-value>root</param-value>
10         </init-param>
11         <init-param>
12             <param-name>url</param-name>
13             <param-value>jdbc:mysql://localhost3306/test</param-value>
14         </init-param>
15     </filter>
16 
17 Filter 代码: 18     public void init(FilterConfig filterConfig) throws ServletException { 19         
20         // 一、 获取 Filter 的名称 filter-name 的内容
21         System.out.println("filter-name 的值是: " + filterConfig.getFilterName()); 22         
23         // 二、 获取在 web.xml 中配置的 init-param 初始化参数
24         System.out.println("初始化参数 username 的值是: " + filterConfig.getInitParameter("username")); 25         System.out.println("初始化参数 url 的值是: " + filterConfig.getInitParameter("url")); 26         
27         // 三、 获取 ServletContext 对象
28  System.out.println(filterConfig.getServletContext()); 29     }

 

6、FilterChain 过滤器链

    FilterChain 对象是在 doFilter() 方法被调用时做为参数传递进来的。

    

     doFilter() 方法用于调用 Filter 链上的下一个过滤器,若是当前过滤器为最后一个,过滤器则将请求发送到目标资源。

    FilterChain 过滤器链(多个过滤器如何一块儿工做)  

  (1)执行顺序:若是有两个过滤器:过滤器1和过滤器2

           ① 过滤器1前置代码

       ② 过滤器2前置代码

       ③ 资源执行 doFilter()

       ④ 过滤器2 后置代码

       ⑤ 过滤器1 后置代码

  (2)过滤器前后顺序问题

       ① 注解配置:

        规则:按照类名的字符串比较规则比较,值小的先执行。

        如: AFilter 和 BFilter,AFilter就先执行了。

       ② web.xml 配置:

        规则: 按照 <filter-mapping> 的顺序决定的,若是定义的位置越靠前,越先被调用;

  (3)多个 Filter 过滤器执行的特色

      ① 全部 Filter 和目标资源默认都执行在同一个线程中;

      ② 多个 Filter 共同执行的时候,它们都是使用同一个 Request 对象;

  执行流程图:

  

7、Filter 的拦截路径(目标资源)

  目标资源指的是须要调用 Filter 来进行过滤处理的资源。主要有如下几种配置方式:

  一、精确匹配

    经过 <filter-mapping> 下的 url-pattern 来配置

    格式

<url-pattern>/target.jsp</url-pattern>

           以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/target.jsp

    精确匹配只要在请求地址彻底同样时才会调用 Filter 

  二、目录匹配

    路径匹配只要是所请求的资源在设置的路径下就会调用 Filter 

    格式:

<url-pattern>/admin/*</url-pattern>

     以上配置的路径,表示请求地址必须为:http://ip:port/工程路径/admin/*

  三、后缀名匹配

    后缀匹配只要访问的资源路径是以指定后缀结尾就会调用 Filter 

      格式:

<url-pattern>*.html</url-pattern>
以上配置的路径, 表示请求地址必须以.html 结尾才会拦截到
<url-pattern>*.do</url-pattern>
以上配置的路径, 表示请求地址必须以.do 结尾才会拦截到
<url-pattern>*.action</url-pattern>
以上配置的路径, 表示请求地址必须以.action 结尾才会拦截到

  

    注意:Filter 过滤器它只关心请求的地址是否匹配,不关心请求的资源是否存在!

  四、使用 servlet-name 配置

    经过 filter-mapping 中的 servlet-name 来指定过滤的 Servlet

    在 Filter 的 filter-mapping 中增长了一个 servlet-name 标签,这个标签的值是其中某一个 servlet 的名字,在访问 Servlet 时就会调用该过滤器请求。

    如图:

    

8、过滤器细节

  二、过滤器的执行流程?

    (1)执行过滤器

    (2)执行要放行的资源

    (3)回来执行过滤器放行代码下面的代码

  三、过滤器的生命周期方法?

    (1)init 方法:在服务器启动后,会建立Filter对象,而后调用init方法。只执行一次,通常用于加载资源。

    (2)doFilter 方法:每一次请求被拦截资源时,会执行。执行屡次

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

  四、过滤器配置详解?

    (1)拦截路径配置

       1. 具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行

       2. 拦截目录:        /admin/*     访问/user下的全部资源时,过滤器都会被执行

       3. 后缀名拦截:    *.jsp            访问全部后缀名为jsp资源时,过滤器都会被执行

       4. 拦截全部资源: /*                访问全部资源时,过滤器都会被执行

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

          在 filter-mapping 还有一个子标签 dispatcher,该标签用来指定须要 Filter 处理的请求类型,该标签能够配置四个值

        配置

          设置 dispatcherTypes 属性

          

属性名 解释
REQUEST 默认值。浏览器直接请求资源
FORWARD 转发访问资源时调用 Filter
INCLUDE 动态包含访问资源时调用Filter
ERROR 错误跳转资源
ASYNC 异步访问资源

       web.xml 配置

           设置 <dispatcher></dispatcher>标签,在里面填入上面的值便可。

        以上四种状况能够设置一个,也能够同时设置多个,若是不设置默认是 Request。

相关文章
相关标签/搜索