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

如何将部分请求发送到另一个url

屠锐
2023-03-14

我有一个Web服务,它使用Spring Rest Controller(使用Netty而不是Apache Tomcat)处理GET/POST/PUT HTTP请求。我希望过滤我服务中的所有请求,当请求配置了特定的标头时,我希望将此特定请求发送到一个完全不同的URL,同时将响应返回到发送原始请求的相同实体。

这是我的代码:

@Component
public class MyWebFilter implements WebFilter {

    @Autowired
    private SomeService someService;
    private final Logger log = LoggerFactory.getLogger(MyWebFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
        HttpHeaders headers = serverWebExchange.getRequest().getHeaders();
        if (headers.containsKey("someHeader")) {
            if (someService.askSomething(Objects.requireNonNull(headers.get("someHeader")))) {
                URI originalUri = serverWebExchange.getRequest().getURI();
                log.info("Redirecting request with URI {} to some service", originalUri.getPath());
                try {
                    URI someUri = new URI("http",
                            originalUri.getUserInfo(),
                            someService.getHost(),
                            someService.getPort(),
                            originalUri.getPath(),
                            originalUri.getQuery(),
                            originalUri.getFragment());
                    ServerHttpRequest newRequest =  serverWebExchange.getRequest().mutate().uri(someUri).build();
                    ServerWebExchange newExchange = serverWebExchange.mutate().request(newRequest).build();
                    return webFilterChain.filter(newExchange);
                } catch (URISyntaxException e) {
                    throw new IllegalStateException(e.getMessage(), e);
                }
            }
        }
        return webFilterChain.filter(serverWebExchange);
    }
}

在这个实现中,请求只是传递给我的普通rest控制器,而不会到达其他服务。我错过了什么?

共有1个答案

马才
2023-03-14

您应该添加@Order并指定正确的顺序,然后设置debug=true以查看过滤器的执行情况。另请参见spring webflux webfilters

 类似资料:
  • 问题内容: 我有以下POST请求表格(简化): 我尝试发送POST请求: 但它返回状态并带有以下注释: 请指出我的错误。我应该进行哪些更改才能使其正常工作? 问题答案: 您自己设置标题,包括边界。不要这样 会为您生成一个边界并将其设置在标头中,但是如果您 已经 设置了标头,那么生成的有效负载和标头将不匹配。只需将标题全部放下即可: 请注意,我还给了零件一个文件名(路径的基本名称)。 有关多部分PO

  • 我有两个endpointapi,它们是/uploadand/redirect 我不知道为什么会发生这种情况。谢谢你的帮助。

  • 问题内容: 我必须将数据(json对象)发送到另一个Web服务器(java)。 这是我的node.js代码 这是行不通的。我怎样才能做到这一点? 问题答案: 您正在重复请求,并为发布请求重新分配变量。我已经更新了您的代码并与requestb.in一起对其进行了测试 请将请求主机和代码中的路径更新为所需的值。让我知道它是否仍然对您不起作用。

  • 问题内容: 我试图将数组作为ajax请求的一部分发送,如下所示: 我想看看我在servlet中得到了什么,所以我使用了这一行: 返回表示空地图。 Firebug告诉我我遇到错误 如果我像这样发送一个queryString 作为“数据”,那么一切工作正常,因此它与无法按原样发送数组有关。我要怎么做才能将该数据放入servlet进行进一步处理。如果可以避免,我不想将其拉出并变成JS中的queryStr

  • 问题内容: 基于:使用jQuery中止Ajax请求 …在stock_search()中-在发出ajax请求之前,如何在发出新请求之前检查当前的任何请求并中止()?还是…有更好的方法吗? 问题答案: 创建所有请求的数组队列。然后,如果找到需要中止所有现有请求的位置,则可以遍历数组并在所有未决请求上调用中止。应该很简单。 尽管另一种方法是只保留一个内部标志,该标志指示当前是否正在处理一个请求,如果有请

  • 我需要从客户端发送一个多部分/表单数据POST(xliff文件)到我的Node.js服务器,然后在Node.js捕获数据并将该POST转发到另一个Java服务。 我使用了和来解析表单数据流,并在Node.js中捕获xliff的Buffer,并且都给了我文件,其内容作为缓冲区。 但是,我似乎无法在Node层中重新创建FormData对象来将POST转发到Java服务。 我继续从Java服务中得到错误