相關另一好文:過濾器、監聽器、攔截器的區別
過濾器
過濾器是一個程序,它先於與之相關的servlet或JSP頁面運行在服務器上。它是隨你的web應用啟動而啟動的,只初始化一次,以后就可以攔截相關請求,只有當你的web應用停止或重新部署的時候才銷毀。
作用
請求和回應的過濾,傳入的request,response提前過濾掉一些信息,或者提前設置一些參數,然后再傳入servlet或者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者struts的action前統一設置字符集,或者去除掉一些非法字符(聊天室經常用到的,一些罵人的話)。
Servlet過濾器的基本原理
在請求進入容器之后,還未進入Servlet之前進行預處理;在請求結束返回給前端之前進行后期處理。處理完成后,它會交給下一個過濾器處理,直到請求發送到目標為止。
攔截器
攔截器,在AOP(Aspect-Oriented Programming)中用於在某個方法或字段被訪問之前,進行攔截然后在之前或之后加入某些操作。比如日志,安全等。
攔截器鏈,就是將攔截器按一定的順序聯結成一條鏈。在訪問被攔截的方法或字段時,攔截器鏈中的攔截器就會按其之前定義的順序被調用。
一般攔截器方法都是通過動態代理的方式實現。
作用
比如通過它來進行權限驗證,或者判斷用戶是否登陸,或者是像12306 判斷當前時間是否是購票時間。
區別
①攔截器是基於動態代理的,而過濾器是基於函數回調。
②攔截器不依賴於servlet容器,通過動態代理實現,過濾器依賴於servlet容器。
③攔截器可以在方法前后,異常前后等調用,而過濾器只能在請求前和請求后各調用一次。
④攔截器可以利用依賴注入,因此在Spring框架程序中,優先攔截器。
1.過濾器是JavaEE標准,采用函數回調的方式進行。是在請求進入容器之后,還未進入Servlet之前進行預處理,並且在請求結束返回給前端這之間進行后期處理。
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("before..."); chain.doFilter(request, response); System.out.println("after..."); }
2.攔截器是被包裹在過濾器之中的。
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion"); }
看一下執行順序

過濾器(Filter)與攔截器(Interceptor)區別:
1、過濾器是基於函數回調,而攔截器是基於java的反射機制;
2、過濾器是servlet規范規定的,只能用於web程序中,而攔截器是在spring容器中,它不依賴servlet容器
3、過濾器可以攔截幾乎所有的請求(包含對靜態資源的請求),而攔截器只攔截action請求(不攔截靜態資源請求)
4、過濾器不能訪問action上下文及值棧里的對象,而攔截器都是可以的。
5、攔截器可以獲取spring容器里的對象,而過濾器是不行的
6、攔截器在action的生命周期內是可以多次調用,而過濾器只在容器初始化時被調用一次。
7、攔截器是被包裹在過濾器之中。
————————————————
版權聲明:本文為CSDN博主「白玉灬風」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_34871626/article/details/79185829
