Servlet之过滤器

六、过滤器

(一)Filter基础

1.Filter简介

Filter是Servlet规范的三大组件之一。可以在请求到达目标资源之前先对请求进行拦截过滤,也可以在响应到达客户端之前先对响应进行拦截过滤

2.Filter的生命周期

Filter的生命周期阶段有四个
(1)Filter对象的创建
(2)Filter对象的初始化
(3)Filter执行doFilter()方法
(4)Filter对象被销毁
Filter整个生命周期过程的执行,均由Web服务器负责管理

3.Filter接口

在Servlet规范中,有一个Filter接口,实现了该接口的类称为过滤器
该接口中有三个方法
init(),doFilter(),destroy()

package Filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class MyFilter implements Filter
{
    
    
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException 
	{
    
    
		System.out.println("执行了doFilter方法");
		//将请求放行到下一个资源
		chain.doFilter(request, response);
	}
}

注册filter

<?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">
	<!-- 注册filter -->
	<filter>
		<filter-name>this</filter-name>
		<filter-class>Filter.MyFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>this</filter-name>
		<!-- 对所有请求进行过滤 -->
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

4.Filter的特征

(1)Filter是在应用启动时被创建和初始化的
(2)Filter是单例多线程的,刷新网页时不会重新创建,只有一个
(3)Filter在应用被停止时销毁的
(4)doFilter()方法:无论哪个线程访问,只要由该Filter进行过滤,就会执行该Filter的doFilter()方法,并且每过滤一次就执行一次
(5)由于Filter是单例多线程的,为了保证其线程安全,一般不为Filter添加可修改的成员变量

5.FilterConfig

package Filter;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//本例演示FilterConfig的基本用法
//FilterConfig中保存了Filter在web.xml中的注册信息
public class MyFilter implements Filter
{
    
    
	private FilterConfig filterConfig;
	public void init(FilterConfig filterConfig) throws ServletException 
	{
    
    
		this.filterConfig = filterConfig;
	}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException 
	{
    
    
		//获取Filter的name
		String filterName = filterConfig.getFilterName();
		System.out.println("filterName = " + filterName);
		//获取所有的初始化参数
		Enumeration<String> names = filterConfig.getInitParameterNames();
		while(names.hasMoreElements()) 
		{
    
    
			String name = names.nextElement();
			String value = filterConfig.getInitParameter(name);
			System.out.println(name + " = " + value);
		}
		//将请求放行到下一个资源
		chain.doFilter(request, response);
	}
}
<?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">
	<!-- 注册filter -->
	<filter>
		<filter-name>this</filter-name>
		<filter-class>Filter.MyFilter</filter-class>
		<!-- 添加初始化参数 -->
		<init-param>
			<param-name>name</param-name>
			<param-value>zhangsan</param-value>
		</init-param>
		<init-param>
			<param-name>age</param-name>
			<param-value>100</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>this</filter-name>
		<!-- 对所有请求进行过滤 -->
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

6.Filter的url-pattern

<?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">
  	<!-- 注册filter -->
	<filter>
		<filter-name>this</filter-name>
		<filter-class>Filter.MyFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>this</filter-name>
		<!-- 对所有请求进行过滤 -->
		<!-- 若Filter为全路径匹配,则url-pattern只能写为/*而不能写为/ -->
		<!--  <url-pattern>/*</url-pattern>  -->
		<!-- filter-mapping中可以不使用url-pattern,但需要指定servlet-name,即当前过滤器拦截的是对指定servlet的请求 -->
		<servlet-name>this</servlet-name>
	</filter-mapping>
	<servlet>
		<servlet-name>this</servlet-name>
		<servlet-class>Servlet.Test</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>this</servlet-name>
		<!-- 
			/*:表示当前Servlet可以匹配所有的请求,即可以拦截所有的请求(动态/静态)
			/:不会拦截动态资源请求,即不会拦截对于jsp页面的请求,但会拦截静态资源
		 -->
		<url-pattern>/test</url-pattern>
	</servlet-mapping>
</web-app>

7.Filter实现的功能:

(1)快速解决Post和Get的中文乱码问题
(2)某些页面必须用户登录后才能访问,可以利用filter实现过滤

猜你喜欢

转载自blog.csdn.net/weixin_46841376/article/details/113575701