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

使用SpringBoot WebClient时如何拦截请求

沈曜灿
2023-03-14

我正在尝试使用<code>网络客户端

谢谢

-斯里尼

共有3个答案

景嘉实
2023-03-14

您可以使用< code > ExchangeFilterFunction 并在您使用的< code>WebClient实例上对其进行配置。请参阅Spring Framework参考文档了解更多信息。

仲孙宇定
2023-03-14

在我的情况下,我需要从传入的请求中获取一些标头,并将它们放入我的请求中。我在这里找到了我需要的东西。

首先需要一个过滤器

/**
 * ReactiveRequestContextFilter
 *
 * @author L.cm
 */
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
public class ReactiveRequestContextFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        return chain.filter(exchange)
        .subscriberContext(ctx -> ctx.put(ReactiveRequestContextHolder.CONTEXT_KEY, request));
    }
}

ReactiveRequestContextHolder

/**
 * ReactiveRequestContextHolder
 *
 * @author L.cm
 */
public class ReactiveRequestContextHolder {
    static final Class<ServerHttpRequest> CONTEXT_KEY = ServerHttpRequest.class;

    /**
     * Gets the {@code Mono<ServerHttpRequest>} from Reactor {@link Context}
     * @return the {@code Mono<ServerHttpRequest>}
     */
    public static Mono<ServerHttpRequest> getRequest() {
        return Mono.subscriberContext()
            .map(ctx -> ctx.get(CONTEXT_KEY));
    }

}

最后,正如Michael McFadyen所说,您需要配置一个< code > ExchangeFilterFunction ,在我的例子中,我需要Auth和origin:

private ExchangeFilterFunction headerFilter() {
    return (request, next) -> ReactiveRequestContextHolder.getRequest()
            .flatMap(r -> {
                ClientRequest clientRequest = ClientRequest.from(request)
                        .headers(headers -> {
                            headers.set(HttpHeaders.ORIGIN, r.getHeaders().getFirst(HttpHeaders.ORIGIN));
                            headers.set(HttpHeaders.AUTHORIZATION, r.getHeaders().getFirst(HttpHeaders.AUTHORIZATION));
                        })
                        .build();
                return next.exchange(clientRequest);
            });
}
任长卿
2023-03-14

使用 WebClient Builder 时,可以使用 filter() 方法传入 ExchangeFilterFunction 接口的实现。这等效于 RestTemplateClientHttpRequestInterceptor

WebClient Builder Docs:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/reactive/function/client/WebClient.Builder.html#filter-org.springframework.web.reactive.function.client.ExchangeFilterFunction-

ExchangeFilterFunction Docs:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/reactive/function/client/ExchangeFilterFunction.html

例如:

WebClient webClient = WebClient.builder()
        .baseUrl("http://localhost:8080|)
        .filter(logFilter())
        .build();


private ExchangeFilterFunction logFilter() {
    return (clientRequest, next) -> {
        logger.info("External Request to {}", clientRequest.url());
        return next.exchange(clientRequest);
    };
}
 类似资料:
  • 问题内容: 我知道如何拦截所有请求,但是我只想拦截来自我资源的请求。 有谁知道如何做到这一点? 问题答案: 如果只想拦截来自特定资源的请求,则可以使用可选的action 属性。Angular的文档请参见此处(用法>操作) 的JavaScript Plunker:http ://plnkr.co/edit/xjJH1rdJyB6vvpDACJOT?p=preview

  • Spring的处理器映射机制包含了处理器拦截器。拦截器在你需要为特定类型的请求应用一些功能时可能很有用,比如,检查用户身份等。 处理器映射处理过程配置的拦截器,必须实现 org.springframework.web.servlet包下的 HandlerInterceptor接口。这个接口定义了三个方法: preHandle(..),它在处理器实际执行 之前 会被执行; postHandle(..

  • 我在我的项目中使用。所有POST数据都以格式发送,并在服务器端解编入各自的bean中。类似于这样: 向服务器发送请求: 我从这里得到了REST拦截器的实现。 我想访问拦截器中的有效载荷(请求体)。由于数据是JSON格式的,因此不能作为请求参数访问。是否有一种方法可以在拦截器方法中获得请求正文?请指教。

  • 一、拦截请求 mitmproxy的强大功能是拦截请求。拦截的请求将暂停,以便用户可以在将请求发送到服务器之前修改(或丢弃)该请求。mitmproxy的set intercept命令配置拦截。i默认情况下,该命令绑定到快捷方式。 通常不希望拦截所有请求,因为它会不断中断您的浏览。因此,mitmproxy希望将流过滤器表达式作为set intercept选择性拦截请求的第一个参数。在下面的教程中,我们

  • 我正在使用spring-kafka-2.2.7。RELEASE并尝试在方法级别使用@KafkaListener与ConvoltKafkaListenerContainerFactory一起创建一个消费者。根据我的理解,这将创建一个ConvoltMessageListenerContainer。 > 如果我有两种不同的方法使用@KafkaListener来消费两个不同的主题,它会创建两个Contop

  • 问题内容: 我在我的项目中使用。所有POST数据都以格式发送,并在服务器端解组到各自的bean中。像这样: 向服务器发送请求: 有效负载: 服务器端: MangaBean: 在控制台上输出: 我从这里获得了REST-interceptor实现。 我想访问拦截器中的有效负载(请求主体)。由于数据为JSON格式,因此无法将其作为请求参数进行访问。 有没有办法在拦截器方法中获取请求正文? 请指教。 问题