具有查询参数的路径上顶点中的 Cors

Cors in vertx on path with query paramters

我有域A和域B。

domainA 将 API 发送到 domainB。我想添加 Cors 能力 Vertx 以确保它是我的发送 API 的 domainA。 其余的是具有查询参数的 URL。

例如 URL: /hello?queryParam=var.

我想做这样的事情:

router.route(".../hello?queryParam=var").handler(CorsHandler.create("specificOriginDomain")

但我还有另一个 API(在代码中的不同位置)具有相同的 URL 但没有查询参数:“.../hello” 我不想阻止 Cors

我如何阻止(使用 Cors)与他的查询参数相关的特定 URL?

虽然您的要求在技术上是可行的,但我必须同意您可能不应该这样做的评论。

让我试着解释一下。您可以在同一条路线上设置两个处理程序,它会起作用:

router.get("hello").handler(CorsHandler.create("specificOriginDomain"));
router.get("hello").handler((req) -> { ... });

但这将对所有路由应用相同的逻辑,无论查询参数与否。

此外,CORS 默认是阻塞的。因此,当您指定 CorsHandler 时,您实际上允许来自该域的跨源请求,而不是相反。不过,您的所有请求似乎都来自同一个域。

我建议的是在处理程序中实现与 CORS 无关的逻辑:

router.get("hello").handler((ctx) -> { 

   if (ctx.request().getParam("var") != null) {
      ctx.fail(403);
   }
   else {
      // Continue as usual 
   }
 });

你也可以看看CorsHandler实际是如何实现的:

https://github.com/vert-x3/vertx-web/blob/master/vertx-web/src/main/java/io/vertx/ext/web/handler/impl/CorsHandlerImpl.java#L162

如果我理解正确的话,目标是只有在有 HTTP 参数时才具有 CORS。在这种情况下,您需要编写自定义处理程序。这是一个简单的例子:

// create the desired CORS handler to check CORS as you desire
// this handler is not be used directly but will be used 
CORSHandler cors = CORSHandler.create(...);

Handler<RoutingContext> myCORSHandler = (ctx) -> {
  if (ctx.request().getParam("var") != null) {
    // your request contains the parameter "var" so
    // we will make it go through the CORS Handler
    cors.handle(ctx);
  } else {
    // the request is "safe" so we ignore the CORS
    // and go to the next handler directly
    ctx.next();
  }
});

// later in your application, just use your CORS handler
Router app = Router.router(vertx);
...
app.route().handler(myCorsHandler);
app.route().handler(ctx -> {
  // depending in the params when you reach here, the CORS
  // have been checked or not...
  // if you want to know which case happened, just add a
  // property to the context in the "if" statement in the
  // custom handler, e.g.: ctx.put("CORS", true)
});