**

JavaWeb过滤器—Filter用法简介

servlet filter listener 是web前端的三大组件,今天来说一说Filter~

**
一、什么是过滤器

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

bloomfilter过滤 java java filter过滤器用法_java

土匪就相当于过滤器,过滤掉你身上的钱财,才能让你过去哦

(要想过此路,留下买路钱 )

bloomfilter过滤 java java filter过滤器用法_filter_02

二、.过滤器的快速入门

*如何编写过滤器*
  • 1、编写java类实现Filter接口
  • 2、重写doFilter方法
  • 3、设置拦截的url
package com.cn.web.Filter;

import java.io.IOException;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;

//配置拦截路径
//@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
public class FilterDemo implements Filter{

	@Override
	//销毁
	public void destroy() {
		// TODO Auto-generated method stub
		//在服务器关闭后,filter对象被销毁,如果服务器是正常关闭,则会正常执行(如果是tomcat客户端的窗口,直接×就是非正常关闭)
		//用于释放资源,只执行一次
		Filter.super.destroy();
		System.out.println("销毁");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		//每一次请求资源拦截时,会执行
		// TODO Auto-generated method stub
		//对request对象的请求消息增强
		System.out.println("Filter被执行了");
		//是否放行
		chain.doFilter(request, response);
		//对response对象的相应消息增强
		System.out.println("filter回来了");
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		//在服务器启动后,会创建Filter对象,然后调用init方法,只执行一次,用于加载资源
		Filter.super.init(filterConfig);
	    System.out.println("出生");
	}

}

*注意哦:Filter要导入javax.servlet的包呢~~~~*

3.过滤器的配置

(1)web.xml

注解可以自己配置,也可以在new JavaWeb项目的时候,直接选2.5的哦,系统会自动生成~

<filter>
    <display-name>FilterDemo</display-name>
     <!--名称-->
    <filter-name>FilterDemo</filter-name>
      <!--过滤器类全称--> 
    <filter-class>com.cn.web.Filter.FilterDemo</filter-class>
  </filter>
  <filter-mapping>
    <!--映射路径配-->
    <filter-name>FilterDemo</filter-name>
     <!--过滤的url匹配规则和Servlet的一模一样--> 
    <url-pattern>/FilterDemo</url-pattern>
  </filter-mapping>

在配置中需要注意的有两处:一是指明过滤器类所在的包路径。二是处定义过滤器作用的对象。一般有以下规则:

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

如果一个过滤器需要过滤多种文件,则可以配置多个,一个mapping定义一个url-pattern来定义过滤规则。

**- 拦截方式配置----资源被访问的方式**

  1.设置dispatchTypes属性

      (1)request:默认值

      (2)forward:转发访问资源

      (3)include:包含访问资源

      (4)error:错误跳转资源

      (5)async:异步访问资源

(2)注解配置

//配置拦截路径
//@WebFilter("/*")//访问所有资源之前,都会执行该过滤器

三、过滤器的生命周期

1.init方法:在服务器启动后,会创建FI列特人对象,然后调用init方法,只加载一次,用于加载资源

  2.doFilter方法:,每一次请求被拦截时,会执行,执行多次

  3.destroy方法:在服务器关闭后,Filter对象被销毁。如果服务器对象正常关闭,则会执行destoy方法,只执行一次

四、过滤器的执行顺序

1.执行过滤器

 2.执行放行前的代码

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

五、多个Filter的执行顺序

如果一定要确保执行顺序,就要对配置进行修改了,执行顺序如下:
1.在web.xml中,filter执行顺序跟new的顺序有关,先声明的先执行。
2.使用注解配置的话,filter的执行顺序跟名称的字母顺序有关,例如AFilter会比BFilter先执行。

如果既有在web.xml中声明的Filter,也有通过注解配置的Filter,那么会优先执行web.xml中配置的Filter。

bloomfilter过滤 java java filter过滤器用法_tomcat_03

//FilterDemo3
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("FilterDemo3被执行了..");
		// pass the request along the filter chain
		chain.doFilter(request, response);
		System.out.println("FilterDemo3回来了..");
	}


//FilterDemo4
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("FilterDemo4被执行了..");
		// pass the request along the filter chain
		chain.doFilter(request, response);
		System.out.println("FilterDemo4回来了..");
	}

//结果
FilterDemo3被执行了..
FilterDemo4被执行了..

FilterDemo4回来了..
FilterDemo3回来了..
<filter>
    <display-name>FilerDemo3</display-name>
    <filter-name>FilerDemo3</filter-name>
    <filter-class>com.cn.web.Filter.FilerDemo3</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>FilerDemo3</filter-name>
    <url-pattern>/success.jsp</url-pattern>
  </filter-mapping>
  <filter>
    <display-name>FilterDemo4</display-name>
    <filter-name>FilterDemo4</filter-name>
    <filter-class>com.cn.web.Filter.FilterDemo4</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>FilterDemo4</filter-name>
    <url-pattern>/success.jsp</url-pattern>
  </filter-mapping>

bloomfilter过滤 java java filter过滤器用法_filter_04

亲,你懂了咩?

下一篇来介绍用过滤器写登录验证哦~~~