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。