SpringBoot2.0實戰 | 第四章:配置Interceptor攔截器

相關知識

關於攔截器的相關知識可參考:https://jinnianshilongnian.iteye.com/blog/1670856

目標

學會在 SpringBoot 的項目中怎麼配置攔截器

操作步驟

添加依賴

引入 Spring Boot Starter 父工程

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
</parent>

整體依賴如下所示

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

編碼

  1. 編寫攔截器
public class TraceInterceptor implements HandlerInterceptor {

    private static final Logger log = LoggerFactory.getLogger(TraceInterceptor.class);

    /**
     * 預處理回調函數
     * 進入Controller之前執行
     * 如果返回 true,則進入下一個攔截器,所有攔截器全部通過,則進入 Controller 相應的方法
     * 如果返回 false,則請求被攔截。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String uri = request.getRequestURI();
        log.info("<-----------------------------------");
        log.info("request uri: {}", uri);
        log.info("----------------------------------->");
        return true;
    }

    /**
     * 後處理回調方法
     * 經過Controller處理之後執行
     * 在此處可以對模型數據進行處理或對視圖進行處理
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("entry postHandler");

    }

    /**
     * 整個請求處理完畢回調方法,即在視圖渲染完畢時回調
     * 在此處可以進行一些資源清理
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}
  1. 註冊攔截器

WebMvcConfigurer 接口提供了對 SpringMVC 的個性化配置。
實現 WebMvcConfigurer 接口的 addInterceptors 方法進行攔截器的註冊。

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(traceInterceptor());
    }

    @Bean
    public TraceInterceptor traceInterceptor() {
        return new TraceInterceptor();
    }

}
  1. Controller 層代碼
@RestController
public class HelloController {

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

}
  1. 啓動類
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

驗證結果

編寫測試用例

@RunWith(SpringRunner.class)
@WebAppConfiguration
@SpringBootTest(classes = Application.class)
public class TraceInterceptorTest {

    private MockMvc mvc;

    @Autowired
    private WebApplicationContext webApplicationContext;

    @Before
    public void setUp() {
        mvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }

    @Test
    public void testInsert() throws Exception {
        MvcResult mvcResult = mvc.perform(
                MockMvcRequestBuilders
                        .get("/hello")
        )
        .andDo(MockMvcResultHandlers.print())
        .andReturn();

        Assert.assertEquals(200, mvcResult.getResponse().getStatus());
    }

}

源碼地址

本章源碼 : https://gitee.com/gongm_24/spring-boot-tutorial.git

結束語

使用 SpringMVC 時是使用 XML 進行註冊,SpringBoot 則推薦使用代碼進行註冊,最終結果其實是一樣的,所以只需要知道操作步驟即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章