Skip to content

Commit f91ef9e

Browse files
committed
定义多个拦截器,并决定它们的执行顺序
1 parent 41b41f5 commit f91ef9e

File tree

2 files changed

+89
-5
lines changed

2 files changed

+89
-5
lines changed

docs/basis/springboot-filter.md

+85
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ public class MyFilter implements Filter {
7878

7979
`MyFilterConfig.java`
8080

81+
在配置中注册自定义的过滤器。
82+
8183
```java
8284
@Configuration
8385
public class MyFilterConfig {
@@ -112,3 +114,86 @@ public class MyFilterWithAnnotation implements Filter {
112114

113115
### 4.定义多个拦截器,并决定它们的执行顺序
114116

117+
加入我们现在又加入了一个过滤器怎么办?
118+
119+
`MyFilter2.java`
120+
121+
```java
122+
@Component
123+
public class MyFilter2 implements Filter {
124+
private static final Logger logger = LoggerFactory.getLogger(MyFilter2.class);
125+
126+
@Override
127+
public void init(FilterConfig filterConfig) {
128+
logger.info("初始化过滤器2");
129+
}
130+
131+
@Override
132+
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
133+
//对请求进行预处理
134+
logger.info("过滤器开始对请求进行预处理2:");
135+
HttpServletRequest request = (HttpServletRequest) servletRequest;
136+
String requestUri = request.getRequestURI();
137+
System.out.println("请求的接口为2:" + requestUri);
138+
long startTime = System.currentTimeMillis();
139+
//通过 doFilter 方法实现过滤功能
140+
filterChain.doFilter(servletRequest, servletResponse);
141+
// 上面的 doFilter 方法执行结束后用户的请求已经返回
142+
long endTime = System.currentTimeMillis();
143+
System.out.println("该用户的请求已经处理完毕,请求花费的时间为2:" + (endTime - startTime));
144+
}
145+
146+
@Override
147+
public void destroy() {
148+
logger.info("销毁过滤器2");
149+
}
150+
}
151+
152+
```
153+
154+
在配置中注册自定义的过滤器,通过`FilterRegistrationBean``setOrder` 方法可以决定 Filter 的执行顺序。
155+
156+
```java
157+
@Configuration
158+
public class MyFilterConfig {
159+
@Autowired
160+
MyFilter myFilter;
161+
162+
@Autowired
163+
MyFilter2 myFilter2;
164+
165+
@Bean
166+
public FilterRegistrationBean<MyFilter> setUpMyFilter() {
167+
FilterRegistrationBean<MyFilter> filterRegistrationBean = new FilterRegistrationBean<>();
168+
filterRegistrationBean.setOrder(2);
169+
filterRegistrationBean.setFilter(myFilter);
170+
filterRegistrationBean.setUrlPatterns(new ArrayList<>(Arrays.asList("/api/*")));
171+
172+
return filterRegistrationBean;
173+
}
174+
175+
@Bean
176+
public FilterRegistrationBean<MyFilter2> setUpMyFilter2() {
177+
FilterRegistrationBean<MyFilter2> filterRegistrationBean = new FilterRegistrationBean<>();
178+
filterRegistrationBean.setOrder(1);
179+
filterRegistrationBean.setFilter(myFilter2);
180+
filterRegistrationBean.setUrlPatterns(new ArrayList<>(Arrays.asList("/api/*")));
181+
return filterRegistrationBean;
182+
}
183+
}
184+
```
185+
186+
实际测试效果如下:
187+
188+
```shell
189+
2019-10-22 22:32:15.569 INFO 1771 --- [ main] g.j.springbootfilter.filter.MyFilter2 : 初始化过滤器2
190+
2019-10-22 22:32:15.569 INFO 1771 --- [ main] g.j.springbootfilter.filter.MyFilter : 初始化过滤器
191+
2019-10-22 22:32:55.199 INFO 1771 --- [nio-8080-exec-1] g.j.springbootfilter.filter.MyFilter2 : 过滤器开始对请求进行预处理2:
192+
请求的接口为2:/api/hello
193+
2019-10-22 22:32:55.199 INFO 1771 --- [nio-8080-exec-1] g.j.springbootfilter.filter.MyFilter : 过滤器开始对请求进行预处理:
194+
请求的接口为:/api/hello
195+
该用户的请求已经处理完毕,请求花费的时间为:1037
196+
该用户的请求已经处理完毕,请求花费的时间为2:1037
197+
```
198+
199+
源代码地址:

source-code/basis/springboot-filter/src/main/java/github/javaguide/springbootfilter/config/MyFilterConfig.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,21 @@ public class MyFilterConfig {
1919
MyFilter2 myFilter2;
2020

2121
@Bean
22-
public FilterRegistrationBean<MyFilter> myFilter() {
22+
public FilterRegistrationBean<MyFilter> setUpMyFilter() {
2323
FilterRegistrationBean<MyFilter> filterRegistrationBean = new FilterRegistrationBean<>();
24-
filterRegistrationBean.setOrder(1);
24+
filterRegistrationBean.setOrder(2);
2525
filterRegistrationBean.setFilter(myFilter);
2626
filterRegistrationBean.setUrlPatterns(new ArrayList<>(Arrays.asList("/api/*")));
2727

2828
return filterRegistrationBean;
2929
}
3030

3131
@Bean
32-
public FilterRegistrationBean<MyFilter2> myFilter2() {
32+
public FilterRegistrationBean<MyFilter2> setUpMyFilter2() {
3333
FilterRegistrationBean<MyFilter2> filterRegistrationBean = new FilterRegistrationBean<>();
34-
filterRegistrationBean.setOrder(2);
34+
filterRegistrationBean.setOrder(1);
3535
filterRegistrationBean.setFilter(myFilter2);
3636
filterRegistrationBean.setUrlPatterns(new ArrayList<>(Arrays.asList("/api/*")));
37-
3837
return filterRegistrationBean;
3938
}
4039
}

0 commit comments

Comments
 (0)