SpringMVC攔截器和過濾器的區別

【基礎篇】

過濾器和攔截器的區別:

①攔截器是基於java的反射機制的,而過濾器是基於函數回調。   
②攔截器不依賴與servlet容器,過濾器依賴與servlet容器。
③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
④攔截器可以訪問action上下文、值棧裏的對象,而過濾器不能訪問。
⑤在action的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
⑥攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裏注入一個service,可以調用業務邏輯。

攔截器可以獲取ioc中的service bean實現業務邏輯,攔截器可以獲取ioc中的service bean實現業務邏輯,攔截器可以獲取ioc中的service bean實現業務邏輯,

觸發時機:

1.過濾器是在請求進入容器後,但請求進入servlet之前進行預處理的。請求結束返回也是,是在servlet處理完後,返回給前端之前。
2.過濾器的觸發時機是容器後,servlet之前,所以過濾器的doFilter(
ServletRequest request, ServletResponse response, FilterChain chain
)的入參是ServletRequest ,而不是httpservletrequest。因爲過濾器是在httpservlet之前。

在這裏插入圖片描述

總結:過濾器包裹住servlet,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...");
    }
    

1、chain.doFilter(request, response);這個方法的調用作爲分水嶺。事實上調用Servlet的doService()方法是在chain.doFilter(request, response);這個方法中進行的。
2、過濾器是JavaEE標準,採用函數回調的方式進行。是在請求進入容器之後,還未進入Servlet之前進行預處理,並且在請求結束返回給前端這之間進行後期處理。

攔截器


    //preHandle()這個方法是在過濾器的chain.doFilter(request, response)方法的前一步執行,也就是在 [System.out.println("before...")][chain.doFilter(request, response)]之間執行。
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }
	
	//preHandle()方法之後,在return ModelAndView之前進行,可以操控Controller的ModelAndView內容。
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }


	//afterCompletion()方法是在過濾器返回給前端前一步執行,也就是在[chain.doFilter(request, response)][System.out.println("after...")]之間執行。
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }

1、攔截器是被包裹在過濾器之中的。
2、攔截器是spring容器的,是spring支持的
3、SpringMVC的機制是由同一個Servlet來分發請求給不同的Controller,其實這一步是在Servlet的service()方法中執行的。

在這裏插入圖片描述

在這裏插入圖片描述

無意中刷到的博客,感覺不錯記錄一下,點擊此處查看原文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章