1. 程式人生 > >springboot分別使用過濾器,攔截器,切片

springboot分別使用過濾器,攔截器,切片

1,springboot使用過濾器;

第一步:自定義一個類實現Filter類,然後在類上面使用@Component自定義為一個bean即可,這種方式最簡便,但是有時候我們使用第三方過濾器,人家的程式碼不能改動,我們又不能在它上面使用註解,那麼springboot怎麼使用它呢?如下:

定義一個spring配置類。

 

過濾器不知道呼叫的目的,即哪個controller,哪個方法,我們只知道request,response。而攔截器就知道。

2,springboot使用攔截器:

第一步:自定義一個類實現HandlerInterceptor類並重寫方法,

@Component

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub

    }

}

第一個方法在呼叫controller之前呼叫返回true就會往下執行,第二個方法在處理玩controller後呼叫,但是如果執行過程中有異常就不會呼叫,第三個方法無論有沒異常都會呼叫。那麼為什麼說攔截器可以得到呼叫的controller與及方法的資訊呢?如下:

通過第三個引數handler,這個類可以轉型為HandlerMethod,及當前物件。但是還有個侷限性,它不知道方法的引數值是什麼。

剛剛說有沒有異常第三個方法都會執行,那麼沒有異常時第三個方法的Exception引數是空的。

 

上面的講解基本完成,這裡講一下注意點,這裡光靠上面的@Component註解,這個攔截器不能起作用。還是需要配置的。如下:

 

需要自定義個配置類繼承WebMvcConfigurerAdapter,把自定義的攔截器類注入進來,然後重寫addTnterceptor方法。

這裡有個地方要注意,如果你定義了全域性異常處理器類,如@ControllerAdvice,這時候這裡就不能接收到異常,因為異常已經被異常處理器接收,如果沒有在異常處理器宣告處理這個異常,那麼在攔截器上就會被接收。

 

3,springboot使用切片

切片就是一個類,

 

有如下註解:@before,@after,@afterthrow,@Around,@Around這個把前面三個都包含在裡面。 一般都是用around.

我們先看一個表示式:execution(* com.kk.ww.UserController.*(..)),這個第一個星號代表任何返回值,第二個是這個controller任何的方法,括號裡面的..代表任何的引數。

上面的handle方法有一個引數,這個引數物件包含當前攔截方法的資訊。

但是在aop中拿不到它的原始的http請求與相應的物件。

 

總結:這三個攔截機制各有各的優勢。

他們的順序(沒出異常):filter->interceptor->controlleradvice->aspect->controller

如果出異常,就是上面的倒過來。controller出現異常,首先由aspect切片處理,如果他沒有處理,那麼交給controlleradvice處理,如果還沒沒處理,就交給interceptor。