拦截器

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;
}
/*
执行完毕控制器,渲染页面之前,可以在modelAndView中暴露一些参数信息
*/
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);
}
/**
MyHandlerInterceptor 是我定义的一个拦截器
*/
@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 有指定注解的