带查询参数的路径上vertx中的Cors

带查询参数的路径上vertx中的Cors,cors,vert.x,query-parameters,Cors,Vert.x,Query Parameters,我有域名A和域名B domainA向domainB发送API。我想添加Cors功能,使用Vertx确保是我的domainA发送API。 其余的是带有查询参数的URL 例如,此URL:/hello?queryParam=var 我想这样做: router.route(“…/hello?queryParam=var”).handler(CorsHandler.create(“specificOriginDomain”) 但我还有另一个API(在代码中的不同位置),它具有相同的URL,但没有查询参数:

我有域名A和域名B

domainA向domainB发送API。我想添加Cors功能,使用Vertx确保是我的domainA发送API。 其余的是带有查询参数的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);
}
否则{
//照常继续
}
});
您还可以看到
CorsHandler
是如何实际实现的:


如果我正确理解,目标是只有在有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)
});
//创建所需的CORS处理程序,以便根据需要检查CORS
//此处理程序不能直接使用,但将被使用
CORSHandler cors=CORSHandler.create(…);
处理器mycorshHandler=(ctx)->{
if(ctx.request().getParam(“var”)!=null){
//您的请求包含参数“var”,因此
//我们会让它通过CORS处理程序
手柄(ctx);
}否则{
//请求是“安全的”,因此我们忽略CORS
//然后直接转到下一个处理程序
ctx.next();
}
});
//稍后在应用程序中,只需使用CORS处理程序
路由器应用程序=路由器。路由器(vertx);
...
app.route().handler(myCorsHandler);
app.route()处理程序(ctx->{
//根据你到达这里时的参数,CORS
//是否已检查过。。。
//如果您想知道发生了什么情况,只需添加一个
//属性中的“if”语句中的上下文
//自定义处理程序,例如:ctx.put(“CORS”,true)
});

如果请求有(或没有)查询参数,是否要使用CORS阻止请求?CORS不是合适的机制。CORS关注跨来源请求。谢谢,我不清楚,我有2个域。我想使用cors,以确保它确实是我的网站发送请求。但是我只想对查询参数为@RainbowDash的请求这样做,CORS在这里不是合适的解决方案。CORS将帮助您防止您的客户被诱骗到跨源相关的攻击中,但不会确保其唯一向domainB发送请求的domainA。任何人都可以像使用curl这样的工具一样简单地伪造原始标题。非常感谢你的回答,我不清楚,我有两个域。我想使用cors,以确保它确实是我的网站发送请求。但我只想对带有查询参数的请求执行此操作,请参见。不过,您仍然需要自己检查是否有查询参数
CorsHandler
无法检查此项。非常感谢,它非常有用:)编写处理程序的好方法!