Vertx router的failureHandler()出现异常CONNECT请求URL问题求助
处理Vert.x Web中畸形CONNECT请求的方案
1. 先明确请求性质
这类URL格式重复(如http://example.com:443example.com:443)的CONNECT请求,基本是恶意扫描工具、有缺陷的客户端或代理程序构造的畸形请求,不属于正常业务场景的合法请求,无需做兼容处理,直接拦截即可。
2. 前置拦截(推荐方案)
在Router最前端添加全局拦截路由,提前过滤这类异常请求,避免进入后续业务逻辑:
router.route().handler(ctx -> { HttpMethod method = ctx.request().method(); String absoluteURI = ctx.request().absoluteURI(); // 匹配CONNECT方法+域名端口重复的畸形URL if (HttpMethod.CONNECT.equals(method) && absoluteURI.matches("^http://.+:\\d+.+:\\d+$")) { ctx.response().setStatusCode(400).end("Invalid request format"); return; } ctx.next(); });
3. 优化FailureHandler逻辑
如果请求已经走到FailureHandler,针对这类异常请求单独处理,避免污染正常错误日志:
router.failureHandler(ctx -> { Throwable failure = ctx.failure(); HttpMethod method = ctx.request().method(); String absoluteURI = ctx.request().absoluteURI(); // 判断是否为畸形CONNECT请求导致的失败 if (HttpMethod.CONNECT.equals(method) && absoluteURI.matches("^http://.+:\\d+.+:\\d+$")) { ctx.response().setStatusCode(400).end("Malformed request"); // 可选:跳过这类请求的错误日志记录,或标记为低级别日志 return; } // 你的原有业务失败处理逻辑 // ... });
4. 额外优化:全局拒绝CONNECT请求
如果你的服务本身不需要处理CONNECT请求(非代理服务),可以直接全局拒绝所有CONNECT方法:
router.route(HttpMethod.CONNECT).handler(ctx -> { ctx.response().setStatusCode(405).end("Method Not Allowed"); });
内容的提问来源于stack exchange,提问作者Tijo
相关产品推荐
相关产品推荐

