溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC的攔截器鏈怎么實現及配置

發布時間:2022-08-30 11:52:25 來源:億速云 閱讀:193 作者:iii 欄目:開發技術

這篇“SpringMVC的攔截器鏈怎么實現及配置”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“SpringMVC的攔截器鏈怎么實現及配置”文章吧。

1、攔截器鏈實現

只需定義多個攔截器的 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/*");
    }
}

2、攔截器鏈的執行順序

攔截器配置類中,首先被添加的攔截器在外層,之后添加的在內層,請求發出之后首先被外層的攔截器攔截,外層放行后進入內層,而離開攔截器時先離開內層的攔截器,再離開外層。

上例子中第一個攔截器在外層,第二個在內層,所以上例中攔截器的輸出順序為:

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的攔截器鏈怎么實現及配置”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女