简介:
控制过滤器的执行顺序:<filter-mapping>
<filter-mapping>的配置顺序决定了Filter的执行顺序;
创建两个Servlet:
AServlet:
package demo1;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("------Aervlet 0-----");
System.out.println("------Aervlet 1-----");
}
}
BServlet:
package demo1;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("----------- BServlet 0---------");
req.getRequestDispatcher("/AServlet").forward(req, resp); //转发
System.out.println("----------- BServlet 1---------");
}
}
再创建AFilter和BFilter:
AFilter:
package demoFilter;
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;
public class AFilter implements Filter {
/**
* 创建之后立即执行,用来做初始化,Filter在服务器启动时就创建
*/
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("AFilter:过滤器出生!");
}
/**
* 每次过滤时都会执行
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("AFilter:拦截成功!");
chain.doFilter(request, response);
System.out.println("AFilter:已放行!");
}
/**
* 销毁之前执行,用来对非内存资源进行释放
*/
public void destroy() {
System.out.println("AFilter:过滤器死亡!");
}
}
BFilter:
package demoFilter;
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 BFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("BFilter:拦截成功!");
System.out.println("BFilter:已放行!");
}
}
然后进行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_4_0.xsd"
id="WebApp_ID" version="4.0">
<display-name>day041301</display-name>
<filter>
<filter-name>AFilter</filter-name> <!-- 自定义名称 -->
<filter-class>demoFilter.AFilter</filter-class> <!-- Filter类所在路径 -->
</filter>
<filter>
<filter-name>BFilter</filter-name> <!-- 自定义名称 -->
<filter-class>demoFilter.BFilter</filter-class> <!-- Filter类所在路径 -->
</filter>
<filter-mapping>
<filter-name>BFilter</filter-name> <!-- 自定义名称匹配 -->
<url-pattern>/AServlet</url-pattern> <!-- 拦截的资源路径 -->
</filter-mapping>
<filter-mapping>
<filter-name>AFilter</filter-name> <!-- 自定义名称匹配 -->
<url-pattern>/AServlet</url-pattern> <!-- 拦截的资源路径 -->
</filter-mapping>
</web-app>
现在是BFilter的<filter-mapping>标签在前,拦截顺序应该是BFilter先进行拦截:
浏览器访问AServlet:
查看控制台输出:
果然是BFilter先拦截。
然后将AFIlter放在BFilter前面试试:
先进行拦截的变成了AFilter。