Spring Cloud Gateway MVC:自定义过滤器的操作顺序不可预测

问题描述 投票:0回答:1

我正在使用 Java21、Spring Boot 3.2 和 spring-cloud-starter-gateway-mvc:4.1.1;

我正在尝试将网关(webflux)移植到gateway-mvc,在网关中我需要调用授权服务,然后将接收到的数据添加到标头中。 我有一个所有微服务都使用的日志记录启动器,它包含一个负责日志记录的类(RequestResponseFilter 扩展 AbstractRequestLoggingFilter)。 我使用 .before(request -> {//call auth}) 在 RouterFunction 中调用授权服务,但是我遇到了一个问题,之前调用了 RequestResponseFilter,并且从授权获取的标头没有出现在我的日志中。

为了实现我的目标,我尝试使用 .filter() 和 .after() 并注意到过滤器操作的顺序不可预测,具体取决于我使用的编码风格。为了更清楚起见,我附上了屏幕截图。

在联系 auth 后,如何更好地在网关中执行标头丰富,以便在调用 RequestResponseFilter 时,我需要的所有标头都已在上下文中?

@Slf4j
public class RequestResponseFilter extends AbstractRequestLoggingFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
                                    FilterChain filterChain) throws ServletException, IOException {
        log.info("AbstractRequestLoggingFilter Number");
        try {
            super.doFilterInternal(request, response, filterChain);
        } finally {
            MDC.clear();
        }
    }

}

spring-mvc spring-cloud spring-cloud-gateway gateway webfiltering
1个回答
0
投票

我猜你的“RequestResponseFilter”是一个servlet过滤器。由于 servlet 过滤器采取的所有预操作都发生在任何 Spring Cloud Gateway MVC 过滤器之前,因此您观察到的行为非常明显。

我建议在自定义 servlet 过滤器而不是 Spring Cloud Gateway MVC 过滤器中调用授权服务。

接下来,您可以使用

@Order
注释定义 servlet 过滤器执行的顺序。这样,您的用于授权的自定义 servlet 过滤器将在此“RequestResponseFilter”的预操作之前执行预操作。

© www.soinside.com 2019 - 2024. All rights reserved.