Spring一步到位精通攔截器
1 攔截器
攔截器是Spring中的概念,和過濾器類似,可以對用戶請求進行攔截過濾處理。但是相對于過濾器而言,攔截器要的控制更加的細節(jié),攔截器可以在三個地方進行執(zhí)行:
- 可以在請求達到Controller控制器之前,通過攔截器執(zhí)行一段代碼
- 也可以在控制器執(zhí)行之后,通過攔截器執(zhí)行一段代碼,此時只是Controller執(zhí)行完畢視圖還沒有開始渲染
- 最后在整個請求結(jié)束的時候還可以通過攔截器執(zhí)行一段代碼
使用攔截器的方法
- 創(chuàng)建支持它的@Component類,它應該實現(xiàn)HandlerInterceptor接口
- 實現(xiàn)WebMVCConfigure配置器,注冊到spring容器中,添加攔截路徑和放行路徑
攔截器和過濾器的區(qū)別:
攔截器(Interceptor)類似于Servlet中的過濾器( Filter),它主要用于攔截用戶請求并做相應的處理。
- 過濾器只能在容器初始化時被調(diào)用異常,在action的生命周期中,而攔截器可以多次被調(diào)用。
- 過濾器可以對幾乎所有的請求起作用,攔截器只能對action請求起作用。
- 過濾器不能訪問action上下文、堆棧里的對象,而攔截器可以訪問。
- 過濾器是基于函數(shù)回調(diào),而攔截器不依賴與servlet容器。
- 過濾器不能獲取IOC容器中的各個bean,而攔截器可以,這點很重要,在攔截器里注入一個service,可以調(diào)用業(yè)務邏輯
攔截器是在DispatcherServlet這個servlet中執(zhí)行的,因此所有的請求最先進入Filter,最后離開Filter。其順序如下。
Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter
2 實現(xiàn)流程
2.1 引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
2.2 自定義攔截器
package com.example.demo.Interceptor; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class EasyLogControllerInterceptor implements HandlerInterceptor { /** * 在controller調(diào)用之前執(zhí)行 */ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(request.getRequestURI()+"開始執(zhí)行"); return true; } /** * 在controller調(diào)用中執(zhí)行 */ public void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(request.getRequestURI()+"執(zhí)行中"); } /** * 在controller調(diào)用后執(zhí)行 */ public void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(request.getRequestURI()+"執(zhí)行結(jié)束"); } }
2.3 注入適配器
package com.example.demo.Interceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class IntercepterConfig implements WebMvcConfigurer { @Autowired private EasyLogControllerInterceptor easyLogControllerInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //addPathPatterns用于添加攔截路徑 //excludePathPatterns用于添加不攔截的路徑 registry.addInterceptor(easyLogControllerInterceptor).addPathPatterns("/hello"); } //此方法用于配置靜態(tài)資源路徑 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**").addResourceLocations("classpath:/my/"); } }
執(zhí)行結(jié)果如下:
訪問hello接口時,會進入攔截器,其他的接口不會進入。
3 控制器驗證
多個攔截器順序
- 多個攔截器的執(zhí)行順序和注冊的順序有關(guān),先注冊的先執(zhí)行
- 可以通過Order方法來設(shè)置執(zhí)行順序,值越小越先執(zhí)行
到此這篇關(guān)于Spring一步到位精通攔截器的文章就介紹到這了,更多相關(guān)Spring攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java異步編程之Callbacks與Futures模型詳解
這篇文章主要為大家詳細介紹了Java異步編程中Callbacks與Futures模型的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-03-03解決idea spring boot 修改html等不重啟即時生效的問題
這篇文章主要介紹了解決idea spring boot 修改html等不重啟即時生效的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02