JAVAWEB——过滤器(Filter),主要编写步骤,访问方式以及Filter的生命周期及API详解

一.Filter的简介

filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理

二、编写步骤

  • 编写一个过滤器的类实现Filter接口
  • 实现接口中尚未实现的方法
  • web.xml中进行配置(主要是配置要对哪些资源进行过滤)

案例:
第一步:实现接口,重写方法

public class QuickFilter1 implements Filter{
    
    
	
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
    
    
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
    
    
		// TODO Auto-generated method stub
		System.out.println("quick1 running...");
		//放行请求
		chain.doFilter(request, response);
	}
	
	@Override
	public void destroy() {
    
    
		// TODO Auto-generated method stub
		
	}

第二步:配置web.xml文件

<filter>
  		<filter-name>QuickFilter1</filter-name>
  		<filter-class>com.filter.filter.QuickFilter1</filter-class>
  </filter>
  <filter-mapping>
  		<filter-name>QuickFilter1</filter-name>
  		<!--对该web应用下的所有的资源进行过滤  -->
  		<url-pattern>/*</url-pattern>
  </filter-mapping>

第三步:书写一个Servlet进行测试

public class Servlet1 extends HttpServlet {
    
    
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
	response.getWriter().write("Servlet1 running...");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
		doGet(request, response);
	}
}

注意:
chain.doFilter(request, response)
如果我们不写这段代码我们就无法访问到Servlet1当中的内容,如果我们书写了这段代码,那么我们会如愿访问到Servlet1里面的内容。此为放行请求。

三、Filter的访问流程

我们在配置<url-pattern>/*</url-pattern>时,会对我们整个web应用下进行过滤。实际上我们在访问Servlet时,会经过多个过滤器,多个filter会形成一个链状,如果想要均通过这些。都需要进行上面的chain.doFilter(request,response)进行放行。
在这里插入图片描述

四.Filter生命周期及API详解

1.Filter生命周期及其与生命周期相关的方法

Filter接口有三个方法:

  • init(Filterconfig):代表filter对象初始化方法 filter对象创建时执行
  • doFilter(ServletRequest,ServletResponse,FilterChain):代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法
  • destory():代表是filter销毁方法 当filter对象销毁时执行该方法

2.Filter对象的生命周期:

  • Filter何时创建:服务器启动时就创建该Filter对象
  • Filter何时销毁:服务器关闭时Filter销毁

3.Filter的API详解

  • init(FilterConfig)方法
    其中参数config代表 该Filter对象的配置信息的对象,内部封装是该filter的配置信息。

案例:

第一步:先写一些web.xml内容

<filter>
  		<filter-name>QuickFilter1</filter-name>
  		<filter-class>com.filter.filter.QuickFilter1</filter-class>
  		<init-param>
  			<param-name>aaa</param-name>
  			<param-value>AAA</param-value>
  		</init-param>
  </filter>
  <filter-mapping>
  		<filter-name>QuickFilter1</filter-name>
  		<!--对该web应用下的所有的资源进行过滤  -->
  		<url-pattern>/*</url-pattern>
  </filter-mapping>

第二步:用init方法获取web.xml的中的信息

@Override
	public void init(FilterConfig filterConfig) throws ServletException {
    
    
		//获得web.xml中的filter的名称——————
		//<filter-name>QuickFilter1</filter-name>
		filterConfig.getFilterName();
		//获得当前filter的初始化参数
		filterConfig.getInitParameter("aaa");
		//获得ServletContext
		filterConfig.getServletContext();
	}
  • destory()方法
    filter对象销毁时执行,关闭服务器即可执行。

  • doFilter方法
    doFilter(ServletRequest,ServletResponse,FilterChain)
    其中的参数:

  • ServletRequest/ServletResponse:每次在执行doFilter方法时 web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request个该response就是在访问目标资源的service方法时的request和response。

  • FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求。他会把我们的filter对象放到一个FilterChain对象里面。其过滤器的顺序,是根据书写的web.xml当中的的顺序去执行过滤器

案例:

<?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>Filter</display-name>
 
  <filter>
  		<filter-name>QuickFilter1</filter-name>
  		<filter-class>com.filter.filter.QuickFilter1</filter-class>
  		<init-param>
  			<param-name>aaa</param-name>
  			<param-value>AAA</param-value>
  		</init-param>
  </filter>
  <!-- 注意此处的filter-mapping-->
  <filter-mapping>
  		<filter-name>QuickFilter1</filter-name>
  		<!--对该web应用下的所有的资源进行过滤  -->
  		<url-pattern>/*</url-pattern>
  </filter-mapping>
    <!-- 注意此处的filter-mapping-->
  <filter>
  		<filter-name>QuickFilter2</filter-name>
  		<filter-class>com.filter.filter.QuickFilter2</filter-class>
  </filter>
  <filter-mapping>
  		<filter-name>QuickFilter2</filter-name>
  		<url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

注意:
该web.xml中 QuickFilter1的<filter-mapping>在QuickFilter2的<filter-mapping>的前面。故使用过滤器的时候会先过滤filter1再过滤filter2。
如图:
在这里插入图片描述

4.Filter的web.xml配置文件

我们再url-pattern配置时,有三种写法:

  • 完全匹配 :/sertvle1
  • 目录匹配 :/aaa/bbb/*
  • 扩展名匹配:*.abc *.jsp

注意:url-pattern可以使用servlet-name替代,也可以混用
如下:

<filter-mapping>
  		<filter-name>QuickFilter1</filter-name>
  		<!--对该web应用下的所有的资源进行过滤  -->
  		<!-- <url-pattern>/*</url-pattern> -->
  		<servlet-name>Servlet1</servlet-name>
  </filter-mapping>

Filter还有另外一个配置方式:

dispatcher

  • REQUEST:默认值,代表直接访问某个资源时执行filter
  • FORWARD:转发时才执行filter
  • INCLUDE: 包含资源时执行filter
  • ERROR:发生错误时 进行跳转是执行filter

如下:

<filter-mapping>
  		<filter-name>QuickFilter1</filter-name>
  		<!--对该web应用下的所有的资源进行过滤  -->
  		<!-- <url-pattern>/*</url-pattern> -->
  		<!-- <servlet-name>/Servlet1</servlet-name> -->
  		<url-pattern>/*</url-pattern>
  		<dispatcher>可以再次进行上述配置</dispatcher>
  </filter-mapping>

猜你喜欢

转载自blog.csdn.net/Mr_GYF/article/details/109299695