SpringBoot拦截器
# Interceptor拦截器
# Interceptor介绍
拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。
你可以使用 Interceptor 来执行某些任务,例如在 Controller 处理请求之前编写日志,添加或更新配置......
在 Spring中,当请求发送到 Controller 时,在被Controller处理之前,它必须经过 Interceptors(0或更多)。
Spring Interceptor是一个非常类似于Servlet Filter 的概念 。
# 过滤器和拦截器的区别
对于过滤器和拦截器的区别:
- 过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。
- 拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。
# 自定义 Interceptor
如果你需要自定义 Interceptor 的话必须实现 org.springframework.web.servlet.HandlerInterceptor接口并且需要重写下面下面3个方法:
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView)
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
注意: preHandle方法返回 true或 false。如果返回 true,则意味着请求将继续到达 Controller 被处理。
# 配置Interceptor
配置拦截器,需要实现WebMvcConfigurer并重写addInterceptors方法
@Component
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(firstInterceptor).addPathPatterns("/api/*");
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 案例
# 创建拦截器
- FirstInterceptor:拦截所有请求
- SecondInterceptor:拦截所有请求
- OldLoginInterceptor:拦截/api/oldLogin请求
FirstInterceptor
@Component
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor-prehandle-进入");
System.out.println("FirstInterceptor-prehandle-请求uri:"+request.getRequestURI());
request.setAttribute("start",System.currentTimeMillis());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor-postHandle-进入");
System.out.println("FirstInterceptor-postHandle-请求uri:"+request.getRequestURI());
Long start= (Long) request.getAttribute("start");
Long end=System.currentTimeMillis();
System.out.println("请求执行时间:"+(end-start));
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("FirstInterceptor-afterCompletion-进入");
}
}
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
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
SecondInterceptor
@Component
public class SecondInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("SecondInterceptor-prehandle-进入");
System.out.println("SecondInterceptor-prehandle-请求uri:"+request.getRequestURI());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("SecondInterceptor-postHandle-进入");
System.out.println("SecondInterceptor-postHandle-请求uri:"+request.getRequestURI());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("SecondInterceptor-afterCompletion-进入");
System.out.println("SecondInterceptor-postHandle-请求uri:"+request.getRequestURI());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
OldLoginInterceptor
/**
* 如果你请求的地址是 /api/oldLogin 则跳转到 /api/login
*/
@Component
public class OldLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("OldLoginInterceptor-prehandle-进入");
System.out.println("OldLoginInterceptor-prehandle-请求uri:"+request.getRequestURI());
response.sendRedirect("/api/login");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("OldLoginInterceptor-postHandle-进入");
System.out.println("OldLoginInterceptor-postHandle-请求uri:"+request.getRequestURI());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("OldLoginInterceptor-afterCompletion-进入");
System.out.println("OldLoginInterceptor-afterCompletion-请求uri:"+request.getRequestURI());
}
}
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
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
# 配置拦截器
@Data
@Component
public class WebConfig implements WebMvcConfigurer {
private final FirstInterceptor firstInterceptor;
private final SecondInterceptor secondInterceptor;
private final OldLoginInterceptor oldLoginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(firstInterceptor).addPathPatterns("/api/*");
registry.addInterceptor(secondInterceptor).addPathPatterns("/api/*");
registry.addInterceptor(oldLoginInterceptor).addPathPatterns("/api/oldLogin");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 测试拦截器
@RestController
@RequestMapping("/api")
public class HelloController {
@RequestMapping("/hello")
public Object hello() throws InterruptedException {
Thread.sleep(2000);
return "hello";
}
@RequestMapping("/login")
public Object login() {
return "login page";
}
@RequestMapping("/oldLogin")
public Object oldLogin() {
return "oldLogin page";
}
}
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
Last Updated: 2024/07/26, 16:12:04