在 build/package/deploy 时禁用 servlet,在 运行 时启用?

Disable servlet at build/package/deploy, enable at run-time?

假设我有一个简单的 "Hello world" 类型的 servlet,配置了注解 @WebServlet("/hello").

我想为 build/deployment 禁用它,因此无法 "call" servlet。我该怎么做?

然后,通过配置文件,我希望能够在运行-time启用servlet ,所以它可以被客户使用。我该怎么做?

这两个都可以吗?

不是通过注释定义 servlet,而是在 web.xml 文件中进行定义。此文件的不同版本可能允许您启用或不启用 servlet。

应在构建和部署时选择要使用的 web.xml 版本。也许通过 Maven 配置文件或类似的。请查看以下 link 以获得一些想法:https://maven.apache.org/guides/mini/guide-building-for-different-environments.html

如果您想要真正的 运行 时间控制,那么您可能需要进行一些自定义编码。一个过滤器(或者,我想,servlet 本身)可以检查 属性 和 return 的值,一个带有 HTTP 错误代码的响应(我想 403 是隐约合适的;404 不那么合适,但是如果你想让它看起来好像那个配置中不存在 servlet,它会起作用...)

您无法通过标准 API 在运行时启用 servlet。为此,它最多只能在 web.xml 的构建期间或 ServletContext#addServlet(). Your best bet is to always enable it and control it on a per-request basis. You can use a servlet filter 的部署期间启用。

首先给servlet起个名字。

@WebServlet(urlPatterns="/hello", name="yourServlet")
public class YourServlet extends HttpServlet {
    // ...
}

这样您就可以轻松地将过滤器直接映射到它,而不必担心 servlet 的 URL 模式。

@WebFilter(servletNames="yourServlet")
public class YourFilter implements Filter {
    // ...
}

在您的过滤器中,只需根据您的配置文件设置决定是继续链,还是 return 404。

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    if (isYourConfigurationFileSettingSet()) {
        chain.doFilter(request, response);
    } else {
        ((HttpServletResponse) response).sendError(HttpServletResponse.SC_NOT_FOUND);
    }
}

isYourConfigurationFileSettingSet()部分根据目前提供的信息无法详细回答。如果您实际上也无法弄清楚,请前往 Where to place and how to read configuration resource files in servlet based application?