带查询参数的路径上vertx中的Cors
我有域名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阻止它带查询参数的路径上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,但没有查询参数:
我怎样才能阻止(使用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
无法检查此项。非常感谢,它非常有用:)编写处理程序的好方法!