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>day041301display-name>
<filter>
<filter-name>AFilterfilter-name>
<filter-class>demoFilter.AFilterfilter-class>
filter>
<filter>
<filter-name>BFilterfilter-name>
<filter-class>demoFilter.BFilterfilter-class>
filter>
<filter-mapping>
<filter-name>BFilterfilter-name>
<url-pattern>/AServleturl-pattern>
filter-mapping>
<filter-mapping>
<filter-name>AFilterfilter-name>
<url-pattern>/AServleturl-pattern>
filter-mapping>
web-app>
现在是BFilter的
浏览器访问AServlet:
查看控制台输出:
果然是BFilter先拦截。
然后将AFIlter放在BFilter前面试试:
先进行拦截的变成了AFilter。