拦截器
springboot中的拦截器介绍
Filter
这个是传统的Servlet中的拦截器,具体的定义如下:
1 2 3 4 5 6 7 8 9
| public interface Filter { default void init(FilterConfig filterConfig) throws ServletException { }
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
default void destroy() { } }
|
我们只需要实现doFilter方法就可以了。
doFilter方法有三个参数,第一个跟第二个分别是请求信息和返回信息,第三个参数是决定请求是否是继续的链式对象。
FilterChain的doFilter方法如果不调用,这个请求就不会继续执行,Controller也就收不到这个请求了。
Filter的优先级要高于Interceptor
HandlerInterceptor
HandlerInterceptor是Spring提供的拦截器,用于在请求前后做一些处理逻辑。当调用到拦截器的时候,已经根据请求确定了要调用的Controller是那个了。在执行Controller之前,调用拦截器
拦截器默认提供了三个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true; }
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { }
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } }
|
注意:
需要自己注册拦截器,我们需要实现WebMvcConfigurer并重写addInterceptors方法,来注册拦截器
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @SpringBootApplication public class FilterApp implements WebMvcConfigurer { public static void main(String[] args) { SpringApplication.run(FilterApp.class, args); }
@Override public void addInterceptors(InterceptorRegistry registry) { WebMvcConfigurer.super.addInterceptors(registry); registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/**"); } }
|
ControllerAdvice
全局异常处理
通过使用ControllerAdvice注解,我们可以很方便的捕捉抛出的异常,并进行处理
1 2 3 4 5 6 7 8 9
| @ControllerAdvice public class ExceptionHandler {
@ExceptionHandler(value = Exception.class) @ResponseBody public String paramExceptionHandler(HttpServletRequest req, ParamException e) { return "发生异常"; } }
|
@Aspect
1 2 3
| @Pointcut 切面 @Around 环绕通知 @within 有指定注解的
|