SpringBoot - 攔截器的注冊和使用(附樣例)


  Spring MVC 中提供了 AOP 風格的攔截器,擁有更加精細的攔截處理能力。Spring Boot 中攔截器的注冊與使用更加方便,下面通過樣例進行演示。

 

1,創建攔截器

首先我們實現 HandlerInterceptor 接口自定義一個攔截器 MyInterceptor1,內容如下:
(1)攔截器中的方法將按 preHandle -> Controller -> postHandle -> afterCompletion 的順序執行,注意:
只有 preHandle 方法返回 true,postHandle、afterCompletion 才有可能被執行;
如果 preHandle 方法返回 false,則該攔截器的 postHandle、afterCompletion 必然不會被執行。
(2)當攔截器鏈內存在多個攔截器時:
其中 preHandle 方法返回 true 的攔截器的 afterCompletion 會執行。
只有所有攔截器的 preHandle 方法都返回 true,postHandle 才會執行。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class MyInterceptor1 implements HandlerInterceptor {
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("MyInterceptor1>>>preHandle");
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor1>>>postHandle");
    }
 
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor1>>>afterCompletion");
    }
}

2,配置攔截器

接着需要定義一個配置類來配置攔截器。自定義類只需實現 WebMvcConfigurer 接口,實現接口中的 addInterceptors 方法即可。
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor1())
            .addPathPatterns("/**") // 配置攔截路徑(所有路徑都攔截)
            .excludePathPatterns("/test2"); // 配置排除的路徑
    }
}

contrlloer

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class HelloController {
 
    @Autowired
    String hello;
 
    @GetMapping("/test")
    public String test() {
        return hello;
    }


    @GetMapping("/test2")
    public String test2() {
        return hello;
    }
}

 

3,運行測試

(1)首先我們通過瀏覽器訪問接口 http://localhost:8080/test,可以看到控制台輸出信息如下,說明攔截器成功啟用:
(2)接着訪問接口http://localhost:8080/test2,由於該路徑被排除再外,因此就沒有被攔截:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM