当前位置: 首页 > 知识库问答 >
问题:

如何在网络涌入中做匹配后过滤?

辛星宇
2023-03-14

正如我们所知,在泽西,我们有前匹配过滤器和后匹配过滤器。

我想知道如何在webflow应用程序中使用WebFilter获得类似的行为。

似乎WebFilter有点像一个预匹配过滤器,无论资源@RestController找到与否,它肯定会被执行。

我的过滤器像这样(从Spring执行器中的指标过滤器复制):

@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这样不匹配的资源,根本没有控制台输出。

谢谢

《这个杀手不太冷》

共有1个答案

常永怡
2023-03-14

Spring web flux < code > web filter 类与Jersey中的前置/后置匹配过滤器的运行级别不同。它实际上更接近于Servlet过滤器。

WebFilter不知道处理请求的内容 - 它可能是控制器,提供静态资源的处理程序或任何其他自定义处理程序。

由于您在这里处于HTTP级别,因此您只需检查请求路径以及响应状态是否不是“404 not Found”。

因为你的问题没有提供你在这里试图实现什么的背景(业务逻辑?身份验证?日志记录?跟踪?任何涉及I/O的操作?),我真的不能说更多关于反应器运算符的选择。

如果您想要一个只在资源上操作的过滤器(如在Jersey Resources中),那么< code>WebFilter不是正确的选择,因为它在较低的级别上操作(所有HTTP交换)。我不认为Spring框架中有这样的基础设施。随意在Spring Framework中打开一个增强请求(这次提供关于您的用例的足够详细的信息)。

 类似资料:
  • 我通过kong创建了一个新的API配置。。(虚拟API)如下所示。 卷曲-i-X POST\ --网址http://localhost:8001/apis/\--data'name=myRESTapi'\--data'hosts=myRESTapi。com'\--data'上游url=http://demo1592110.mockable.io/hello' HTTP/1.1 201创建日期: F

  • 问题内容: 我的机器在端口8080上运行着jboss,我想在网络上共享jboss服务器,以便我使用jbossws- native-4.0.2运行jboss服务,但是我仍然无法访问网络上的jboss服务器,请帮助。 问题答案: 启动jboss(run.sh或run.bat)时使用选项-b 0.0.0.0,这会将端口绑定到所有网络接口。默认值为localhost,这就是为什么您无法通过网络访问服务器的

  • 我的web.xml档案有问题。错误: 元素类型"web-app"的内容必须匹配"(图标?、显示名称?、描述?、可分发?、上下文-参数*、过滤器*、过滤器-映射*、监听器*、servlet*、servlet-映射*、会话-配置?、mime-映射*、欢迎-文件-列表?、错误-页面*、taglib*、资源-环境-参考*、资源-参考*、安全-约束*,login-config?,安全角色*,env入口*,e

  • 尝试创建一个程序,要求用户输入一个位置,如果用户输入,即南,它可以从csv中的“位置”列中读取,无论哪一行包含“南”(接受大写或小写),都会打印名称列中的名称。因此,如果用户输入南,将返回Holos和Deafer。 我似乎找不到如何实际打印包含匹配输入的特定行,只能打印整个列。 非常感谢您的帮助! csv 只读取特定列的当前代码

  • null A-ZA-Z0-90,3)(?ltSerialMarket&>A-ZA-Z0,2)(?ltSerialSuffix&>a-zA-Z0-9*)/code> 基本上它说: 这意味着: 匹配1 完全匹配0-8 组 0-3 abc 组 3-5 fo 组 5-8条 上述案例是预期结果。 当regex失败时,因为第4个和第5个字符是数字而不是字母,所以它失败了,这是正确的。问题是应该与第二组匹配的字

  • 问题内容: 假设在我的Elasticsearch索引中,我有一个名为“点”的字段,其中将包含由标点符号分隔的字符串(例如“ first.second.third”)。 我需要搜索例如“ first.second”,然后获取其“点”字段包含正好是“ first.second”或以“ first.second”开头的字符串的所有条目。 我在理解文本查询的工作方式时遇到问题,至少我无法创建执行此任务的查