相關(guān)知識(shí)
關(guān)于攔截器的相關(guān)知識(shí)可參考:https://jinnianshilongnian.iteye.com/blog/1670856
本章目標(biāo)
學(xué)會(huì)在 SpringBoot 的項(xiàng)目中怎么配置攔截器
操作步驟
添加依賴(lài)
引入 Spring Boot Starter 父工程
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
引入 spring-boot-starter-web
的依賴(lài)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
編碼
- 編寫(xiě)攔截器
public class TraceInterceptor implements HandlerInterceptor {
private static final Logger log = LoggerFactory.getLogger(TraceInterceptor.class);
/**
* 預(yù)處理回調(diào)函數(shù)
* 進(jìn)入Controller之前執(zhí)行
* 如果返回 true顿涣,則進(jìn)入下一個(gè)攔截器,所有攔截器全部通過(guò)舔痪,則進(jìn)入 Controller 相應(yīng)的方法
* 如果返回 false锌唾,則請(qǐng)求被攔截。
*/
@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;
}
/**
* 后處理回調(diào)方法
* 經(jīng)過(guò)Controller處理之后執(zhí)行
* 在此處可以對(duì)模型數(shù)據(jù)進(jìn)行處理或?qū)σ晥D進(jìn)行處理
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("entry postHandler");
}
/**
* 整個(gè)請(qǐng)求處理完畢回調(diào)方法滋捶,即在視圖渲染完畢時(shí)回調(diào)
* 在此處可以進(jìn)行一些資源清理
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
- 注冊(cè)攔截器
WebMvcConfigurer 接口提供了對(duì) SpringMVC 的個(gè)性化配置重窟。
實(shí)現(xiàn) WebMvcConfigurer 接口的 addInterceptors 方法進(jìn)行攔截器的注冊(cè)。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(traceInterceptor());
}
@Bean
public TraceInterceptor traceInterceptor() {
return new TraceInterceptor();
}
}
- 編寫(xiě) controller 接口
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello world";
}
}
- 編寫(xiě)項(xiàng)目啟動(dòng)類(lèi)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
驗(yàn)證結(jié)果
編寫(xiě)測(cè)試用例
@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
總結(jié)
使用 SpringMVC 時(shí)是使用 XML 進(jìn)行注冊(cè),SpringBoot 則推薦使用代碼進(jìn)行注冊(cè)垮衷,最終結(jié)果其實(shí)是一樣的,所以只需要知道操作步驟即可刀闷。