首先我们先建立一个interceptors包,里面写拦截器的类,拦截器要继承于HandlerInterceptor,实现了preHandle(前置方法:执行controller之前执行)、postHandle(后置方法:执行controller之后执行)、afterCompletion(视图渲染完成后执行的方法)
return false代表被拦截,不放行。return true表示放行。
如何加到springboot里呢?
官方说法:
如果你想要保持Spring Boot 的一些默认MVC特征,同时又想自定义一些MVC配置(包括:拦截器,格式化器, 视图控制器、消息转换器 等等),你应该让一个类实现WebMvcConfigurer
,并且添加@Configuration
注解,但是千万不要加@EnableWebMvc
注解。如果你想要自定义HandlerMapping
、HandlerAdapter
、ExceptionResolver
等组件,你可以创建一个WebMvcRegistrationsAdapter
实例 来提供以上组件。如果你想要完全自定义SpringMVC,不保留SpringBoot提供的一切特征,你可以自己定义类并且添加@Configuration
注解和@EnableWebMvc
注解。
总结:所以之后我们需要在config包下新建一个WebMvcConfig类,这个类继承于WebMvcConfigurer类,实现它的addInterceptors方法来添加拦截器。注意要将拦截器类使用@Autowired注入进去
1、定义一个拦截器:
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle method is running!");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle method is running!");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion method is running!");
}
}
2、定义配置类,注册拦截器
@Configuration
public class MvcConfiguration implements WebMvcConfigurer {
@Autowired
private HandlerInterceptor myInterceptor;
/**
* 重写接口中的addInterceptors方法,添加自定义拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
}
}
这里/**表示要过滤全部路径来检查,不能写成一个星号。一个星号是将所有只有一级目录的路径拦下来检查了,而/images/xxx.png就不会被拦。