Spring boot學習 (八) 之Interceptor(攔截器)的學習
前言
上一篇我們介紹了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
,結合上一遍文章,控制檯輸出如下資訊(過濾器和監聽器的學習請移步上一篇文章:ofollow,noindex">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後女程式設計師一枚,記錄工作中的點點滴滴,一起學習,共同進步,期待能和優秀的您交上朋友