JavaWeb之过滤器或拦截器(filter)

一、过滤器的核心接口
  1. javax.servlet.Filter接口
  2. javax.servlet.FilterConfig 接口
  3. 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:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

三、过滤器开发
三个步骤
  1. 创建Filter接口实现类
  2. 编写过滤器的功能实现
  3. 对过滤器进行生命配置

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>

输出结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值