**
JavaWeb过滤器—Filter用法简介
servlet filter listener 是web前端的三大组件,今天来说一说Filter~
**
一、什么是过滤器
- 生活中的过滤器:净水器,空气净化器、土匪
- web中的过滤器:当访问服务器的资源时,过滤器可以请求拦截, 完成一些特殊的功能
- 过滤器的作用:一般用于完成通用的操作。如登录验证、统一编码处理(post)、敏感字符过滤…
土匪就相当于过滤器,过滤掉你身上的钱财,才能让你过去哦
(要想过此路,留下买路钱 )
二、.过滤器的快速入门
*如何编写过滤器*
- 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。
//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>
亲,你懂了咩?
下一篇来介绍用过滤器写登录验证哦~~~