前言
上一篇我們介紹了servlet、filter(過濾器)、listener(監聽器)
在spring-boot
中的註冊,這次學習interceptor(攔截器)
的運用。其實interceptor(攔截器)
和filter(過濾器)
很相似,都用於攔截過濾請求,只是filter
是servlet
範疇的,今天我們要學習的是Spring
提供的HandlerInterceptor(攔截器)
,用到了其中比較重要的類:WebMvcConfigurer
。
正文
攔截器的學習
- 創建自己的攔截器類並實現
HandlerInterceptor
接口
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("在請求處理之前進行調用");
return true;//true纔會向下執行 false取消當前請求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("請求處理之後進行調用");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("整個請求結束之後被調用");
}
}
注:從這裏也可以看出來攔截器比過濾器更爲精細,在request被響應之前、request被響應之後、視圖渲染之前以及request全部結束之後都可以進行控制。雖然不能像filter一樣修改request的內容,但是可以通過拋出異常(或者返回false)來取消request的執行
- 創建一個Java類(
MyWebMvcConfigurer.java
)繼承WebMvcConfigurer
,並重寫addInterceptors
方法。
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
}
}
- 實例化我們自定義的攔截器(
MyInterceptor
),將對像添加到addInterceptors
方法中
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
}
}
- 啓動程序,瀏覽器訪問:
http://localhost:8080/index
,結合上一遍文章,控制檯輸出如下信息(過濾器和監聽器的學習請移步上一篇文章:Spring boot學習 (七) 之servlet、filter(過濾器)、listener(監聽器)的學習):
執行過濾操作
在請求處理之前進行調用
請求處理之後進行調用
監聽器sessiom被創建
整個請求結束之後被調用
總結
只有經過DispatcherServlet
(spring-boot默認爲"/*"
)的請求,纔會走攔截器鏈,我們自定義的Servlet 請求是不會被攔截的,比如我們自定義的Servlet地址 :http://localhost:8080/user/myservlet 是不會被攔截器攔截的,因爲他沒有經過DispatcherServlet
請求。下面這個是自定義的servlet,他不會走攔截器鏈
@WebServlet(urlPatterns="/user/*", description="說明")
public class MyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("》》》》》》doPost方法執行》》》》》》");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("》》》》》》doGet方法執行》》》》》》");
doPost(req, resp);
}
}
原創作者:夢凌小樣
作品鏈接:https://www.jianshu.com/p/518ad8b10334【原創不易,轉載請註明出處,感謝理解】
一位愛生活,愛創作,愛分享,愛自己的90後女程序員一枚,記錄工作中的點點滴滴,一起學習,共同進步,期待能和優秀的您交上朋友