1.思考
前面,我们学到了一个过滤器是如何创建的,以及过滤器的生命周期。我们的服务器会根据用户的请求,将访问的资源先按照要求进行过滤,过滤后反馈给用户相应的响应。那么,当我们的服务器中有多个过滤器的时候,它又会是怎么样的一个执行过程呢?
过滤器,是用来过滤用户访问的资源,即我们的网页。如果两个过滤器过滤的是不同的网页,那么他们彼此没有交集,互不干扰,各干各的事情。但是如果我们的过滤器过滤的是相同的网页的时候,那么又是一个什么样的执行顺序呢?可以举一个我们生活中的例子:
这是一个过滤器,每一层由不同的物质组成。从上往下假设为A,B,C,D,可以把A,B,C,D视为四个过滤器,他们就过滤相同的物质。过滤的顺序当然是从上往下:A->B->C->D,这个顺序是按照过滤器的排列顺序决定的。所以在我们的程序中,过滤相同资源的过滤器的执行顺序,也是按照其在web.xml文件中注册的顺序执行的。
好了,过滤器链了解了。接下来就做一个小demo,实现两个过滤器过滤相同资源时的执行效果。
2.创建两个过滤器
package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/*
* 2018.5.3 Dragon
* 过滤器生命周期的demo
*/
public class FirstFilter implements Filter {
@Override
public void destroy()
{
System.out.println("FirstFilter----------------destroy");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("FirstFilter:start----------doFilter");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("FirstFilter:end------------doFilter");
}
@Override
public void init(FilterConfig arg0) throws ServletException
{
System.out.println("FirstFilter----------------init");
}
}
第二个过滤器:SecondFilter
package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/*
* 2018.5.3 Dragon
* 过滤器生命周期的demo
*/
public class SecondFilter implements Filter {
@Override
public void destroy()
{
System.out.println("SecondFilter----------------destroy");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("SecondFilter:start----------doFilter");
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("SecondFilter:end------------doFilter");
}
@Override
public void init(FilterConfig arg0) throws ServletException
{
System.out.println("SecondFilter----------------init");
}
}
3.在web.xml文件中注册这两个过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>com.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>SecondFilter</filter-name>
<filter-class>com.filter.SecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecondFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
</web-app>
由上面可以看见,两个过滤器过滤的都是:index.jsp这个页面
4.部署工程,访问资源
b.访问index.jsp,在控制台可以看到如下效果:
从控制台的输出可以发现,先是执行第一个过滤器,紧接着执行第二个,第二个过滤器过滤完了,后面也没有其他的过滤器,则打印end信息,再打印第一个过滤器的end信息。
最后送上该工程的下载地址:https://download.youkuaiyun.com/download/qq_36631076/10392232