Fileter过滤器

1. 基本定义

  1. 过滤器的作用
    • 一般用于完成通用操作。如登陆验证、同意编码处理、敏感字符过滤
  2. 快速入门
    • 定义一个类,实现接口Filter,包为javax.servlet
    • 复写方法doFilter
    • 配置拦截路径:配置web.xml或注解配置
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("过滤器。。。。");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}

@Override
public void destroy() {

}
}

2. 过滤器细节

2.1 web.xml配置

  • 在web.xml中的web-app标签体内加入下面代码
1
2
3
4
5
6
7
8
9
<filter>
<filter-name>demo1</filter-name>
<filter-class>cn.hxx.web.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!--拦截路径-->
<url-pattern>/*</url-pattern>
</filter-mapping>
  • WebFilter注解源码:@webFilter用于将注解过滤器,该注解在部署时被容器处理,容器根据具体的属性将相应的类部署为过滤器。该注解有以下属性,均有默认值。但是value、urlPatterns、servletNames三者至少包含一个,且value和urlPatterns一般不要同时赋值,如果同时指定,通常忽略value的取值
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
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebFilter {
String description() default "";//该过滤器的描述信息,等价与<description>标签

String displayName() default "";//该过滤器的显示名,通常配合工具使用,等价与<displayName>标签

WebInitParam[] initParams() default {};//指定一组过滤器初始化参数,等价于<init-param>

String filterName() default "";//指定过滤器的name属性,等价于<filter-name>属性

String smallIcon() default "";

String largeIcon() default "";

String[] servletNames() default {};//指定过滤器将应用于哪些servlet。取值是@WebServlet中的name属性的取值,或者是web.xml中<servlet-name>的取值

String[] value() default {};//等价于urlPatterns

String[] urlPatterns() default {};//指定一组过滤器的URL匹配模式,等价于<url-pattern>标签

DispatcherType[] dispatcherTypes() default {DispatcherType.REQUEST};//指定过滤器的转发模式,包括:ASYNC、ERROR、FORWORD、INCLUDE、REQUEST

boolean asyncSupported() default false;//声明过滤器是否支持异步操作模式,等价于<async-support>标签
}

2.2过滤器执行流程

客户端请求A资源,先执行过滤器放行之前的代码,过滤器放行后执行A资源,然后执行放行代码下的程序

  1. 执行过滤器

  2. 执行放行后的资源

  3. 执行过滤器放行代码下的代码

2.3过滤器生命周期方法

  1. init方法:服务器启动后,会创建Filter对象,然后调用init方法。用于加载资源

  2. dofilter方法:每一次请求被拦截资源时,会执行该方法

  3. destroy方法:服务器正常关闭,Filter对象被销毁,会执行destroy方法。用于释放资源

2.4过滤器配置详解

  1. 拦截路径的配置

    • 配置1:具体的资源路径:/index.jsp 或 /findServlet 只有访问该资源时,过滤器才会被执行

    • 配置2:目录拦截:/user/* 访问/user下的所有资源时,过滤器都会被执行

      1
      2
      3
      4
      5
      @WebServlet("/user/CheckCodeServlet")
      @WebServlet("/user/failServlet")
      //在web目录下还可以建立user子目录,里面也可以存放资源
      @WebFilter("/user/*")
      //访问servlet和访问user目录下的资源都会执行该过滤器
    • 配置3:后缀名拦截:*.jsp 访问所有后缀名为jsp资源时,过滤器都会被执行

    • 配置4:/* 拦截所有资源

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

    • 配置1:注解配置dispatcherTypes,数组,可配置多个选项

      (1) REQUEST:默认值,浏览器直接请求资源

      (2) FORWARD:转发访问资源

      (3) INCLUDE:包含访问资源

      (4) ERROR:错误跳转资源

      (5) ASYNC:异步访问资源

      1
      2
      @WebFilter(value = "/index.jsp",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})java
      //转发到index.jsp 和 直接访问index.jsp 都会执行该过滤器

2.5过滤器链(配置多个过滤器)

  • 执行顺序:有两个过滤器:过滤器1、过滤器2

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

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

      如:AFilter 和 BFilter

    2. web.xml配置:filter-mapping谁定义在上面,谁先执行