JavaEE核心技术之Filter过滤器

概念

*生活中的过滤器:净水器,空气净化器...
web中的过滤器:当访问服务器资源时,过滤器可以将请求拦下来,
                完成一些特殊的功能
过滤器的作用:
        一般用于完成通过的操作。如:登录验证,统一编码处理,敏感字符过滤...

快速入门:

1. 步骤:

1. 定义一个类,实现接口Filter
2. 复写方法
3. 配置拦截路径

2. 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
	@WebFilter("/*") //访问所有的资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("FilterDemo1被执行了。。。");
//放行
filterChain.doFilter(servletRequest, servletResponse);
}

@Override
public void destroy() {

}
}

3. 过滤器细节:

1. web.xml配置

和配置servlet基本一样的

1
2
3
4
5
6
7
8
9
10
<filter>
<filter-name>demo1</filter-name>
<filter-class>com.web.filter.FilterDemo1</filter-class>
</filter>

<filter-mapping>
<filter-name>demo1</filter-name>
<!--拦截路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>

2. 执行流程

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

1
2
3
4
5
6
7
8
9
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//对request对象请求消息增强
System.out.println("filterDemo2...");
//放行
chain.doFilter(req, resp);
//对response对象的响应消息增强
System.out.println("filterDemo2回来了。。。。");
}

3. 过滤器生命周期方法

1. init:在服务器启动后,会创建Filter对象,
         然后调用init方法.只执行一次
2. doFilter:
           每一次请求被拦截时,会被执行,执行多次。
3. destroy:
        在服务器关闭后,filter对象被销毁,
        如果是正常关闭,然后调用destroy方法,执行一次。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package com.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
* @author OldAZ-PC
*/
@WebFilter(urlPatterns = "/FilterDemo3")
public class FilterDemo3 implements Filter {
/*
* 在服务器启动后,会创建Filter对象,然后调用init方法.只执行一次。
* */

@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("init。。。");
}


/*
*每一次请求被拦截时,会被执行,执行多次。
*/

@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("doFilter。。。");
chain.doFilter(req, resp);

}

/*
* 在服务器关闭后,filter对象被销毁,如果是正常关闭,然后调用destroy方法,执行一次。
*
* */

@Override
public void destroy() {
System.out.println("destroy...");
}


}

4. 过滤器配置详解

拦截路径配置

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

拦截方式的配置

资源被访问的方式:

  1. 注解配置
  • 设置dispatcher属性

    - REQUEST:默认值,浏览器直接请求资源
    1
    2
    /*浏览器直接请求index.jsp时,该过滤器会被执行*/
    @WebFilter(urlPatterns = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
    • FOEWORD:转发访问资源

      1
      2
      /*只有浏览器转发访问index.jsp时,该过滤器会被执行*/
      @WebFilter(urlPatterns = "/index.jsp",dispatcherTypes = DispatcherType.REQUEST)
      - INCLUSE:包含访问资源
      - ERROR:错误跳转资源
      - ASYNC:一部访问资源

同时设置多个执行条件:

1
2
/*浏览器直接访问或者转发访问index.jsp时,该过滤器会被执行*/
@WebFilter(urlPatterns = "/index.jsp",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
  1. web.xml
设置<dispatcherTypes></dispatcherTypes>

5. 过滤器链(配置多个过滤器)

配置多个过滤器,可以同时生效

执行顺序和先后

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

  • 执行顺序:

    1. 过滤器1
    2. 过滤器2
    3. 资源执行
    4. 过滤器2
    5. 过滤器1 
  • 过滤器先后顺序问题

  1. 注解配置

    按照类名字符串的字符串进行逐个比较,值小的先被执行。
    例:AFilter和BFliter两个过滤器,AFilter先执行。
  2. web.xml

    谁的<filter-mapping></filter-mapping>定义在上面,谁先执行
文章目录
  1. 1. 概念
  2. 2. 快速入门:
    1. 2.1. 1. 步骤:
    2. 2.2. 2. 代码
    3. 2.3. 3. 过滤器细节:
      1. 2.3.1. 1. web.xml配置
      2. 2.3.2. 2. 执行流程
      3. 2.3.3. 3. 过滤器生命周期方法
      4. 2.3.4. 4. 过滤器配置详解
        1. 2.3.4.1. 拦截路径配置
        2. 2.3.4.2. 拦截方式的配置
      5. 2.3.5. 5. 过滤器链(配置多个过滤器)
        1. 2.3.5.1. 执行顺序和先后
,