【发布时间】:2018-05-28 06:00:15
【问题描述】:
众所周知,在球衣中,我们有匹配前过滤器和匹配后过滤器。
我想知道如何在 webflux 应用程序中使用 WebFilter 获得类似的行为。
看起来 WebFilter 有点像预匹配过滤器,无论@RestController 中是否找到资源,它都会被执行。
我的过滤器是这样的(从弹簧执行器中的指标过滤器复制):
@Component
@Order(100)
public class AppFilter1 implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return chain.filter(exchange).compose((call) -> filter(exchange, call));
}
private Publisher<Void> filter(ServerWebExchange exchange, Mono<Void> call) {
System.out.println("Start AppFilter1 in thread:" + Thread.currentThread().getId() + "..........");
ServerHttpResponse response = exchange.getResponse();
return call.doOnSuccess((done) -> success(exchange)).doOnError((cause) -> {
if (response.isCommitted()) {
error(exchange, cause);
} else {
response.beforeCommit(() -> {
error(exchange, cause);
return Mono.empty();
});
}
});
}
private void success(ServerWebExchange exchange) {
System.out.println("End AppFilter1 in thread:" + Thread.currentThread().getId() + "..............");
}
private void error(ServerWebExchange exchange, Throwable cause) {
System.out.println("End AppFilter1 with Error in thread:" + Thread.currentThread().getId() + "...............");
}
}
添加我的控制器是这样的:
@RestController
public class ExampleController {
@GetMapping("/example")
public String example() {
System.out.println("Example in thread:" + Thread.currentThread().getId());
return "Example";
}
}
我可以看到,无论我访问 /example 还是 /notexist,过滤器都会被执行
实际上我希望我的过滤器进行后匹配,只为 /example 执行。
更具体地说,我希望看到 /example 的控制台输出:
Start AppFilter1 in thread:....
Example in thread:.....
End AppFilter1 in thread:....
对于像 /notexist 这样不匹配的资源,根本没有控制台输出。
谢谢
里昂
【问题讨论】:
-
一个 WebFilter 可以两者兼得;请完成你的问题并解释你想要达到的目标,一个代码 sn-p 显示你到目前为止所做的尝试以及为什么它不是你预期的结果。
-
感谢您的回复!我刚刚用示例代码更新了这个问题。我是响应式新手,我想我可能会使用“compose”以外的其他运算符来实现我的目标。
-
如果没有关于用例的更多信息(你想在那个过滤器中实现什么?),很难就操作员的选择提供指导。对于请求路径部分,您可以检查请求路径并仅在匹配特定路径时应用您的方法。
-
我只想在 /example 之前做一些事情,但我不希望我的 biz 逻辑被执行为像 /abcd 这样不存在的资源。检查过滤器中的请求路径可能不是一个好主意,因为我可能有数百个资源映射。这里,pre-matching 的意思是“无论资源是否匹配,都做某事”,post-matching 的意思是“只有当资源匹配时,才做某事”。
-
期望的执行顺序:匹配前的过滤器--->定位资源----->匹配后的过滤器----->执行匹配的资源。如果没有匹配的资源,则不应调用匹配后过滤器。
标签: spring-boot spring-webflux