一、过滤器的核心接口
- javax.servlet.Filter接口
- javax.servlet.FilterConfig 接口
- javax.servlet.FilterChain 接口
Filter接口
Filter接口和Servlet接口相似,要实现Filter接口,就要提供一个公共的不带参数的构造方法。Filter接口主要的方法
方法 | 描述 |
---|---|
init(FilterConfig config) | 初始化方法同时传递FilterConfig对象 |
doFilter(ServletRequest request,ServletResponse response,FilterChain chain) | 过滤器的功能实现方法 |
destroy() | 结束过滤器的方法 |
FilterConfig接口
FilterConfig接口由容器实现,又来获取过滤器的初始化参数和Servlet相关的信息
FilterConfig接口主要的方法
方法 | 描述 |
---|---|
getFilterName() | 获得过滤器的名称 |
getInitParameter(String name) | 获取指定参数的过滤器初始化参数值 |
getInitParameterNames() | 获得所有的初始化参数,返回枚举类型 |
getServletContext() | 获得ServletContext上下文对象 |
FilterChain接口
FilterChain接口由容器实现,过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中最后一个过滤器,那么将调用目标资源。FilterChain接口主要的方法
方法 | 描述 |
---|---|
doFilter(ServletRequest request,ServletResponse response) | 该方法调用过滤器链中的下一个过滤器,如果该过滤器是链中最后一个过滤器,那么将调用目标资源。 |
二、web.xml配置常用的各节点介绍
<filter>指定一个过滤器。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的限定类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。这些参数可以中Filter实现类里拿到!在过滤器中,通过FilterConfig接口对象来访问初始化参数。
<filter-mapping>元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>子元素用于设置filter的注册名称。该值必须是在<filter>元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher>子元素用来指定 Filter 对资源的多种调用方式进行拦截。
子元素可以设置的值及其意义
REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
三、过滤器开发
三个步骤- 创建Filter接口实现类
- 编写过滤器的功能实现
- 对过滤器进行生命配置
1. 创建Filter接口实现类及功能实现
MyFilter.java
package cn.bzu.filterProject.filter;
import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import com.sun.tools.internal.jxc.gen.config.Config;
/**
* Servlet Filter implementation class MyFilter
*/
@WebFilter("/MyFilter")
public class MyFilter implements Filter {
private String attribute=null;
private FilterConfig config;
//构造方法
public MyFilter() {
// TODO Auto-generated constructor stub
}
public void destroy() {
// TODO Auto-generated method stub
this.attribute=null;
this.config=null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
long startTime = System.currentTimeMillis();
config.getServletContext().log(new Date(startTime)+"请求经过"+this.getClass().getName()+"过滤器");
//使用过滤器进行下一个目标资源的调用
chain.doFilter(request, response);
long endTime = System.currentTimeMillis();
config.getServletContext().log(new Date(endTime)+"响应经过"+this.getClass().getName()+"过滤器,本次响应一共经历"+(endTime-startTime)+"毫秒");
}
//初始化过滤器
public void init(FilterConfig fConfig) throws ServletException {
this.config = fConfig;
this.attribute = config.getInitParameter("param");
config.getServletContext().log("获得初始化参数的值为"+this.attribute);
}
}
2. 对过滤器进行生命配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>filterProject</display-name>
<filter>
<description>filter 实例</description>
<display-name>myFilter</display-name>
<filter-name>MyFilter</filter-name>
<filter-class>cn.bzu.filterProject.filter.MyFilter</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>哼哼的博客</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/MyFilter</url-pattern><!--要拦截的地址 -->
</filter-mapping>
</web-app>
输出结果