请问 Spring cloud gateway 如何在 filter 中解析请求中的文件和字符串变量呢?

251 天前
 bai821547889

各位前辈好,因为我刚接触 Spring cloud gateway ,不太懂这个框架,想请教个问题。

我这个功能逻辑是这样的:在一个自定义的局部过滤器,通过getMultipartData()来解析请求中的文件和字符串变量后做一些业务逻辑,然后不继续走别的过滤器,直接返回。

但是我的这份代码问题在于:

请问这个现象是因为什么引起呢,或者啥关键词可以提示一下?我从凌晨三四点就开始考虑这个问题了,实在无能为力。 谢谢大家。

@Slf4j
@Component
public class FileFilterGatewayFilterFactory extends
        AbstractGatewayFilterFactory<FileFilterGatewayFilterFactory.ParamsConfig>{


    public FileFilterGatewayFilterFactory() {
        super(FileFilterGatewayFilterFactory.ParamsConfig.class);
    }

    @Override
    public GatewayFilter apply(FileFilterGatewayFilterFactory.ParamsConfig config) {
        return new OrderedGatewayFilter(((exchange, chain) -> {
            parseBody(exchange).subscribe();
            
            
            // 如果放行,可以触发 parseBody 里面的方法
            return chain.filter(exchange);
            
            
            // 如果不放行,parseBody 里面的方法根本不执行
            return exchange.getResponse().setComplete();
        }),10);

    }

    public Mono<Object> parseBody(@NotNull ServerWebExchange exchange) {
        return exchange.getMultipartData().map(multipartData -> {
            Map<String, Part> partMap = multipartData.toSingleValueMap();
            Part file = partMap.get("file");
            FormFieldPart bizName = (FormFieldPart) partMap.get("name");
            return Result.buildSuccessResult("成功", null);
        });
    }
783 次点击
所在节点    Java
2 条回复
mmdsun
251 天前
没怎么用过 spring gateway ,看了下文档,继承 ModifyRequestBodyGatewayFilterFactory 等官方提供好的类,比较好实现。不执行返回执行,可以抛个异常,然后用写个异常处理器返回错误信息。

再说代码问题,一般来说,subscribe 方法是异步的,会在另一个线程中执行反应式流,不会等待它的结果。
parseBody 不执行,可能是前线程在 subscribe()方法执行之前就结束了。

代码应该使用操作符来连接你的流,比如:
return parseBody(exchange).flatMap(result -> exchange.getResponse().setComplete());
bai821547889
251 天前
@mmdsun 😘谢谢大佬,听到您的建议,豁然开朗,代码按照您说的,问题已经解决了,真的非常感谢。👍👍👍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972285

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX