【发布时间】:2020-02-13 13:52:03
【问题描述】:
我有一个带端点的控制器。我想在运行时禁用这个端点,这样看起来应用程序对用户来说是离线的。
目前这样做是为了禁用端点:
private static final Map<RequestMappingInfo, HandlerMethod> requestMappings = new HashMap<>();
this.context.getHandlerMethods().forEach((k, v) -> {
if (k.getPatternsCondition().getPatterns().contains("/customer")) {
requestMappings.put(k, v);
}
});
requestMappings.forEach((k, v) -> this.context.unregisterMapping(k));
这要启用:
requestMappings.forEach((k, v) -> this.context.registerMapping(k, v.getBean(), v.getMethod()));
requestMappings.clear();
这就像一个魅力,bean 在运行时未注册和注册。但是,当用户调用我的应用程序时,他们得到的是 404 而不是连接超时,这正是我所寻找的。
我明白为什么会收到 404。请求仍然进入应用程序,但找不到路径,因为 bean 没有注册,所以它返回 404。我该如何处理“实际离线”情况这根本不返回任何东西。
【问题讨论】:
-
您对“离线”的定义似乎有点混乱。 “离线”对我来说意味着“不运行”。如果您想要连接超时,那么对我来说这意味着端口需要打开,连接被接受但在等待太久后被客户端丢弃。这与“离线”不同。如果它处于脱机状态,它首先不会在端口上建立连接。为了实现这一点,您只需删除资源。为什么这会导致任何合理的 Web 服务器实现超时?它可以立即看到资源的不足,因此它会立即返回该错误...。
-
为了让客户端超时,您需要实际提供端点但从不返回任何东西,不是吗?
-
@Michael 确实,这就是我在最后一段文字中想要表达的意思。
-
@daniu 你说得对。在创建上述代码后我明白了这一点,因此我来这里寻求帮助。
标签: java spring rest spring-boot spring-mvc