SpringBoot过滤器
# Spring Filter 过滤器
# Filter 介绍
Filter 过滤器这个概念应该大家不会陌生,特别是对与从 Servlet 开始入门学 Java 后台的同学来说。那么这个东西我们能做什么呢?Filter 过滤器主要是用来过滤用户请求的,它允许我们对用户请求进行前置处理和后置处理,比如实现 URL 级别的权限控制、过滤非法请求等等。Filter 过滤器是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。
另外,Filter 是依赖于 Servlet 容器,Filter接口就在 Servlet 包下面,属于 Servlet 规范的一部分。所以,很多时候我们也称其为“增强版 Servlet”。
如果我们需要自定义 Filter 的话非常简单,只需要实现 javax.Servlet.Filter 接口,然后重写里面的 3 个方法即可!
Filter.java
public interface Filter {
//初始化过滤器后执行的操作
default void init(FilterConfig filterConfig) throws ServletException {
}
// 对请求进行过滤
void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;
// 销毁过滤器后执行的操作,主要用户对某些资源的回收
default void destroy() {
}
}
2
3
4
5
6
7
8
9
10
11
12
13
# Filter是如何实现拦截的?
Filter接口中有一个叫做 doFilter 的方法,这个方法实现了对用户请求的过滤。具体流程大体是这样的:
用户发送请求到 web 服务器,请求会先到过滤器; 过滤器会对请求进行一些处理比如过滤请求的参数、修改返回给客户端的 response 的内容、判断是否让用户访问该接口等等。 用户请求响应完毕。 进行一些自己想要的其他操作。
# 如何自定义Filter
下面提供两种方法。
# 1.自己手动注册配置实现
自定义的 Filter 需要实现javax.Servlet.Filter接口,并重写接口中定义的3个方法。
FirstFilter
@Component
public class FirstFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
System.out.println("初始化firstFilter.............");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//执行之前进行的操作
HttpServletRequest request=(HttpServletRequest) servletRequest;
String uri=request.getRequestURI();
System.out.println("firstFilter请求之前,请求uri:"+uri);
Long start=System.currentTimeMillis();
// servletResponse.getWriter().println("exit");
//执行用户请求
filterChain.doFilter(servletRequest,servletResponse);
//执行完请求之后进行的操作
Long end=System.currentTimeMillis();
System.out.println("firstFilter请求之后,请求执行时间:"+(end-start));
}
@Override
public void destroy() {
Filter.super.destroy();
System.out.println("销毁过滤器.................");
}
}
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
如果不需要用户往下执行请求接口,则不需要执行filterChain.doFilter(servletRequest,servletResponse);在这之前直接通过servletResponse.getWriter().println("");返回结果即可。
在配置中注册自定义的过滤器。
AppConfiguration
@Data
@Configuration
public class AppConfiguration {
private final FirstFilter firstFilter;
@Bean
public FilterRegistrationBean firstFilter1(){
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
filterRegistrationBean.setFilter(firstFilter);
//设置过滤器执行顺序
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/api/*");
return filterRegistrationBean;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 2.通过些注解实现过滤器
SecondFilter
@Component
@WebFilter(filterName = "secondFilter",urlPatterns = "/api/*")
public class SecondFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
System.out.println("初始化secondFilter。。。。。");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("secondFilter请求之前");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("secondFilter请求之后");
}
@Override
public void destroy() {
Filter.super.destroy();
System.out.println("secondFilter销毁。。。。。");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
自定义 Controller 验证过滤器
HelloController
@RestController
@RequestMapping("/api")
public class HelloController {
@RequestMapping("/hello")
public Object hello() throws InterruptedException {
Thread.sleep(2000);
return "Hello World!";
}
}
2
3
4
5
6
7
8
9
10
11
12
13