具有查询参数的路径上顶点中的 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
实际是如何实现的:
如果我理解正确的话,目标是只有在有 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)
});
我有域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
实际是如何实现的:
如果我理解正确的话,目标是只有在有 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)
});