Spring MVC中的攔截器(Interceptor)類似於Servlet中的過濾器(Filter),它主要用於攔截用戶請求並作相應的處理。例如通過攔截器可以進行權限驗證、記錄請求信息的日誌、判斷用戶是否登錄等。
在springBoot中註冊攔截器更加方便,如下:
1. 自定義一個攔截器類
實現HandlerInterceptor 接口,重寫 preHandle、postHandle、 afterCompletion 方法。
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
System.out.println("preHandle>>>>>>>>>>>>>>>");
// 返回值必須爲true才生效
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("postHandle>>>>>>>>>>>>>>>>");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("afterCompletion>>>>>>>>>>>>>>>>>>>>>");
}
}
攔截器中的方法執行流程爲 preHandle → controlle → postHandle → afterCompletion
- preHandle 方法:會在控制器(controller)前執行,返回值表示是否中斷後續執行,當返回值爲true時表示繼續向下執行,爲false時會中斷後續所有操作;
- postHandle 方法:會在控制器方法調用之後,且解析視圖之前執行。可以通過此方法對請求域中的模型和視圖做出進一步的修改;
- afterCompletion 方法:會在整個請求完成,即視圖渲染結束之後執行。可以通過此方法實現一些資源清理、記錄日誌信息等工作。
2.配置攔截器
自定義配置類進行攔截器的配置,實現WebMvcConfigurer 接口,重寫addInterceptors方法,其中addPathPatterns 表示攔截路勁,excludePathPatterns表示排除路勁,如下:
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer{
/**
* 攔截器配置
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
registry.addInterceptor(new MyInterceptor())
// 攔截路勁
.addPathPatterns("/**")
// 排除路徑
.excludePathPatterns("/excludeInterceptor");
}
}
測試類:
@RestController
public class InterceptorController {
@GetMapping("/testInterceptor")
public String testInterceptor() {
return "testInterceptor";
}
@GetMapping("/excludeInterceptor")
public String excludeInterceptor() {
return "excludeInterceptor";
}
}
訪問:當訪問 /testInterceptor 時 攔截器進行攔截,
訪問 /excludeInterceptor 攔截器不進行攔截!