Filter過濾器控制過濾器執行順序
阿新 • • 發佈:2022-04-13
簡介:
控制過濾器的執行順序:<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。