簡介
SpringMVC的處理器攔截器,類似於Servlet開發中的過濾器Filter,用於對請求進行攔截和處理。
常見應用場景
1、權限檢查:如檢測請求是否具有登錄權限,如果沒有直接返回到登陸頁面。
2、性能監控:用請求處理前和請求處理後的時間差計算整個請求響應完成所消耗的時間。
3、日誌記錄:可以記錄請求信息的日誌,以便進行信息監控、信息統計等。
使用方法
1、配置文件
<mvc:interceptors>
<!--對所有的請求記性攔截-->
<!--<beans:beanclass="com.sunp.common.interceptor.Myinterceptor"/>-->
<!--對特定的請求進行攔截-->
<mvc:interceptor>
<!--進行攔截的路徑-->
<mvc:mapping path="/**"/>
<!--不進行攔截的路徑-->
<mvc:exclude-mapping path="/lib/**" />
<beans:bean class="com.sunp.common.interceptor.Myinterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
2、實現接口並繼承方法(可以同時包含多個實現類)
public class myInterceptor implements HandlerInterceptor{
@Override
public boolean preHandler(HttpServletRequest request, HttpServletResponse response, Object obj)throws Exception{
/*該方法將在請求處理之前進行調用,只有該方法返回true,纔會繼續執行後續的Interceptor和Controller,當返回值爲true 時就會繼續調用下一個Interceptor的preHandle 方法,如果已經是最後一個Interceptor的時候就會是調用當前請求的Controller方法;*/
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object obj,Exception e)throws Exception {
/*該方法將在請求處理之後,DispatcherServlet進行視圖返回渲染之前進行調用,可以在這個方法中對Controller 處理之後的ModelAndView 對象進行操作。*/
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2,ModelAndView arg3) throws Exception {
/*該方法也是需要當前對應的Interceptor的preHandle方法的返回值爲true時纔會執行,該方法將在整個請求結束之後,也就是在DispatcherServlet 渲染了對應的視圖之後執行。用於進行資源清理。*/
}
}
執行順序
1、單個實現類的執行順序
preHandler -> Controller -> postHandler -> model渲染-> afterCompletion
2、多個實現類的執行順序
———————preHandler1——————-
———————preHandler2——————-
———————preHandler3——————-
———————–Controller———————
———————postHandler3——————
———————postHandler2——————
———————postHandler1——————
———————postHandler1——————
——————afterCompletion3—————-
——————afterCompletion2—————-
——————afterCompletion1—————-
解決Spring Boot 攔截器注入service爲空的問題
1.需要在攔截器上加@Component
@Component
public class MyInterceptor implements HandlerInterceptor {
//想要注入的類
@Autowired
UserService userService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("request before 攔截");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("post 攔截");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("after 攔截");
}
}
2.進行攔截器配置
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
//關鍵,將攔截器作爲bean寫入配置中
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//多個攔截器組成一個攔截器鏈
// addPathPatterns用於添加攔截規則
// excludePathPatterns用戶排除攔截
registry.addInterceptor(myInterceptor()).addPathPatterns("/**"); //對來自/** 全路徑請求進行攔截
super.addInterceptors(registry);
}
}