相关知识
关于拦截器的相关知识可参考: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>
引入 spring-boot-starter-web
的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
编码
- 编写拦截器
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 则推荐使用代码进行注册,最终结果其实是一样的,所以只需要知道操作步骤即可。