相關知識
關於攔截器的相關知識可參考: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>
編碼
- 編寫攔截器
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 {
}
}
- 註冊攔截器
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();
}
}
- Controller 層代碼
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello world";
}
}
- 啓動類
@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 則推薦使用代碼進行註冊,最終結果其實是一樣的,所以只需要知道操作步驟即可。