SpringBoot 之 Filter、Interceptor、Aspect
springboot 提供了集中拦截机制,可以方便我们在业务层进行扩展,熟悉的有 filter、interceptor、Aspect。像 ControllerAdvice 仅用于处理 controller 异常事比较多的,所以再次不过多介绍。下图介绍了机制所在层次:
# Filter 过滤器
实现方式有两种,过滤器无法获得上下文、值栈里的对象,并对所有请求起作用
# 第一种
实现 Filter 接口
package com.wt.cloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import java.io.IOException;
@Component
@Slf4j
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("执行");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
log.info("销毁");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 第二种
配置到 Bean
package com.wt.cloud.config;
import com.wt.cloud.filter.MyFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter());
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
return filterRegistrationBean;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Interceptor 拦截器
拦截器可以获取 IOC 容器中的各个 bean, 拦截器是基于 java 的反射机制的,拦截器只能对 action 请求起作用,拦截器可以访问 action 上下文、值栈里的对象,但无法获取参数。
# 一、实现 HandlerInterceptor 接口
package com.wt.cloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
@Component
public class MyInterceptor implements HandlerInterceptor{
/**
* 功能描述: 执行方法前
* @return : boolean
* @author : big uncle
* @date : 2019/10/9 12:24
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("执行方法前");
return false;
}
/**
* 功能描述: 执行方法后,有异常不执行
* @return : boolean
* @author : big uncle
* @date : 2019/10/9 12:24
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("执行方法后,有异常不执行");
}
/**
* 功能描述: 执行完一定会执行
* @return : boolean
* @author : big uncle
* @date : 2019/10/9 12:24
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("执行完一定会执行");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 二、注册到 InterceptorRegistration
package com.wt.cloud.config;
import com.wt.cloud.filter.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
//註冊TestInterceptor拦截器 new 或者 注入 都行
InterceptorRegistration registration = registry.addInterceptor(new MyInterceptor());
//所有路径都被拦截
registration.addPathPatterns("/**");
//添加不拦截路径
registration.excludePathPatterns("/","/error","/static/**");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Aspect 切面
Aspect 可以自定义要切入的类甚至再细的方法,粒度最小。
package com.wt.cloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Slf4j
public class MyAspect {
// @Before("execution(* com.wt.cloud.web.HelloWeb.*(..))")
// public void Before(JoinPoint point){
// log.info("执行前");
// }
// @After("execution(* com.wt.cloud.web.HelloWeb.*(..))")
// public void After(JoinPoint point){
// log.info("执行后");
// }
// @AfterThrowing("execution(* com.wt.cloud.web.HelloWeb.*(..))")
// public void AfterThrowing(JoinPoint point){
// log.info("执行异常");
// }
@Around("execution(* com.wt.cloud.web.HelloWeb.*(..))")
public Object Around(ProceedingJoinPoint point) throws Throwable {
log.info("MyAspect 环绕执行");
log.info("MyAspect 参数 ",point.getArgs());
Object obj = point.proceed();
log.info("MyAspect 执行完成结果 ",obj);
return obj;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
上次更新: 4/1/2025, 5:03:02 PM