Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
在springBoot中注册拦截器更加方便,如下:
1. 自定义一个拦截器类
实现HandlerInterceptor 接口,重写 preHandle、postHandle、 afterCompletion 方法。
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
System.out.println("preHandle>>>>>>>>>>>>>>>");
// 返回值必须为true才生效
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("postHandle>>>>>>>>>>>>>>>>");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
System.out.println("afterCompletion>>>>>>>>>>>>>>>>>>>>>");
}
}
拦截器中的方法执行流程为 preHandle → controlle → postHandle → afterCompletion
- preHandle 方法:会在控制器(controller)前执行,返回值表示是否中断后续执行,当返回值为true时表示继续向下执行,为false时会中断后续所有操作;
- postHandle 方法:会在控制器方法调用之后,且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改;
- afterCompletion 方法:会在整个请求完成,即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。
2.配置拦截器
自定义配置类进行拦截器的配置,实现WebMvcConfigurer 接口,重写addInterceptors方法,其中addPathPatterns 表示拦截路劲,excludePathPatterns表示排除路劲,如下:
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer{
/**
* 拦截器配置
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// TODO Auto-generated method stub
registry.addInterceptor(new MyInterceptor())
// 拦截路劲
.addPathPatterns("/**")
// 排除路径
.excludePathPatterns("/excludeInterceptor");
}
}
测试类:
@RestController
public class InterceptorController {
@GetMapping("/testInterceptor")
public String testInterceptor() {
return "testInterceptor";
}
@GetMapping("/excludeInterceptor")
public String excludeInterceptor() {
return "excludeInterceptor";
}
}
访问:当访问 /testInterceptor 时 拦截器进行拦截,
访问 /excludeInterceptor 拦截器不进行拦截!