這篇“SpringMVC的攔截器鏈怎么實現及配置”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“SpringMVC的攔截器鏈怎么實現及配置”文章吧。
只需定義多個攔截器的 bean,然后在攔截器的配置類中將其逐一添加即可
第一個攔截器的定義:
@Component
public class ProjectInterceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle111...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle111...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion111...");
}
}第二個攔截器的定義:
@Component
public class ProjectInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle222...");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle222...");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion222...");
}
}攔截器配置類:
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Autowired
private ProjectInterceptor1 interceptor1;
@Autowired
private ProjectInterceptor2 interceptor2;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor1).addPathPatterns("/books", "/books/*");
registry.addInterceptor(interceptor2).addPathPatterns("/books", "/books/*");
}
}攔截器配置類中,首先被添加的攔截器在外層,之后添加的在內層,請求發出之后首先被外層的攔截器攔截,外層放行后進入內層,而離開攔截器時先離開內層的攔截器,再離開外層。
上例子中第一個攔截器在外層,第二個在內層,所以上例中攔截器的輸出順序為:
preHandle111...
preHandle222...
postHandle222...
postHandle111...
afterCompletion222...
afterCompletion111...
值得注意的是,afterCompletion 方法的一定會在 postHandle 之后執行,并且也是由內層向外層執行,所以 afterCompletion222 輸出在 postHandle111 之后,而在 afterCompletion111 之前。換言之,即便有再多的攔截器,最先執行的 afterCompletion 也一定在最后執行的 postHandle 之后才執行
此外,當攔截器的 preHandle 方法返回 false 時,其內層的攔截器以及它自身 postHandle 和 afterCompletion 都不會再執行,而所有外層攔截器的 postHandle 不再執行,但 afterCompletion 照常執行
這是因為 postHandle 執行在原始 Controller 方法執行之后,必須所有攔截器都放行時,才會執行原始方法,也就才會執行 postHandle 方法
上例中第二個攔截器 preHandle 返回 false 時的輸出順序:
preHandle111...
preHandle222...
afterCompletion111...
以上就是關于“SpringMVC的攔截器鏈怎么實現及配置”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。