首先我們說說什么是處理器攔截器,SpringWebMVC的處理器攔截器,類似于Servlet開發(fā)中的過濾器Filter,用于處理器進(jìn)行預(yù)處理和后處理。
使用場景
1、日志記錄:記錄請求信息的日志,以便進(jìn)行信息監(jiān)控、信息統(tǒng)計(jì)、計(jì)算PV(Page View)等。
2、權(quán)限檢查:如登錄檢測,進(jìn)入處理器檢測檢測是否登錄,如果沒有直接返回到登錄頁面;
3、性能監(jiān)控:有時候系統(tǒng)在某段時間莫名其妙的慢,可以通過攔截器在進(jìn)入處理器之前記錄開始時間,在處理完后記錄結(jié)束時間,從而得到該請求的處理時間(如果有反向代理,如apache可以自動記錄);
4、通用行為:讀取cookie得到用戶信息并將用戶對象放入請求,從而方便后續(xù)流程使用,還有如提取Locale、Theme信息等,只要是多個處理器都需要的即可使用攔截器實(shí)現(xiàn)。
5、OpenSessionInView:如Hibernate,在進(jìn)入處理器打開Session,在完成后關(guān)閉Session。…………本質(zhì)也是AOP(面向切面編程),也就是說符合橫切關(guān)注點(diǎn)的所有功能都可以放入攔截器實(shí)現(xiàn)。
實(shí)現(xiàn)方式
1、引入spring-boot-starter-web
在pom.xml 中引入spring-boot-starter-web包。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、建立攔截器
preHandle :在DispatcherServlet之前執(zhí)行。
postHandle:在controller執(zhí)行之后的DispatcherServlet之后執(zhí)行。
afterCompletion:在頁面渲染完成返回給客戶端之前執(zhí)行。
public class PiceaInterceptor implements HandlerInterceptor {
/**
*在DispatcherServlet之前執(zhí)行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("我是在DispatcherServlet之前執(zhí)行的方法");
return true;
}
/**
* 在controller執(zhí)行之后的DispatcherServlet之后執(zhí)行
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("在controller執(zhí)行之后的DispatcherServlet之后執(zhí)行");
}
/**
* 在頁面渲染完成返回給客戶端之前執(zhí)行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("在頁面渲染完成返回給客戶端之前執(zhí)行");
}
}
3、建立WebAppConfigurer類
這個類的主要作用是注冊上我們配置的攔截器。
@Configuration
public class PiceaWebAppConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationInterceptor())//增加過濾的方法類
.addPathPatterns("/**");//定義過濾的范圍
}
@Bean
public PiceaInterceptor authenticationInterceptor() {
return new PiceaInterceptor();
}
}
4、建立Contoller類
這個類比較簡單,不做特別說明
@RestController
public class PiceaContoller {
@RequestMapping("/query")
public void asyncTask() throws Exception {
System.out.println("我是控制類里面的方法,我正在思考...............");
}
}
5、測試結(jié)果
在瀏覽中輸入:http://localhost:2001/query
這個時候控制臺的輸入為如下圖片。

其它注意
本文章樣例:
工程名:spring-boot-fi-interceptor
GitHub:https://github.com/zzyjb/SpringBootLearning
其它工程請移步