public interface Filter {
default void init(FilterConfig filterConfig) throws ServletException {
}
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() {
}
}
@WebFilter("/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//在Filter物件第一次被建立的時候呼叫,並且只呼叫一次
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//doFilter()只要使用者傳送一次請求,則執行一次,傳送N次,則執行N次。在這個方法中編寫過濾規則
System.out.println("doFilter方法,前1");
//解決跨域問題
HttpServletResponse resp = (HttpServletResponse) servletResponse;
resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Headers", "*");
resp.setHeader("Access-Control-Allow-Method", "*");
//執行下一個過濾器,如果說下一個不是過濾器,則會執行servlet
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("doFilter方法,後1");
}
@Override
public void destroy() {
//在Filter物件被釋放/銷燬之前呼叫,並且只呼叫一次
System.out.println("destroy方法");
}
}
init方法:在Filter物件第一次被建立的時候呼叫,並且只呼叫一次
doFilter方法:只要使用者傳送一次請求,則執行一次,傳送N次,則執行N次。在這個方法中編寫過濾規則
destroy方法:在Filter物件被釋放/銷燬之前呼叫,並且只呼叫一次
filterChain.doFilter(request, response);
執行下一個過濾器,如果下一個不是過濾器,則執行Servlet
目標Servlet是否執行取決於兩個條件:
filterChain.doFilter(request, response);
注意:
<filter-mapping>
的先後。//模仿棧
//模仿Filter設計模式
//缺點:在編譯階段已經完全確定了呼叫關係
//如果想要改變呼叫順序,必須要修改java程式碼
//違背了OCP原則(開閉原則)
public class Test {
public static void main(String[] args) {
System.out.println("main方法執行");
m1();
System.out.println("main執行完畢");
}
public static void m1() {
System.out.println("m1方法執行");
m2();
System.out.println("m1執行完畢");
}
public static void m2() {
System.out.println("m2方法執行");
m3();
System.out.println("m2執行完畢");
}
public static void m3() {
System.out.println("目標正在執行中");
}
}