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

时间:2017-03-07 12:56:03

标签: java servlets wildfly-9

假设我有一个简单的" Hello world"类型servlet,使用注释@WebServlet("/hello")配置。

我想禁用它进行构建/部署,因此无法调用" servlet。我该怎么做?

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

其中任何一种都可能吗?

3 个答案:

答案 0 :(得分:7)

您无法在运行时通过标准API启用servlet。它最多只能在web.xml的构建时间内或ServletContext#addServlet()的部署时间内启用。您最好的选择是始终启用它并根据请求控制它。您可以使用servlet filter进行此操作。

首先给servlet命名。

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

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

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

在您的过滤器中,只需决定是继续链,还是根据您的配置文件设置返回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?

答案 1 :(得分:1)

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

应在构建和部署时选择要使用的web.xml版本。也许是通过Maven简介或类似的。请查看以下链接,了解相关的一些想法:https://maven.apache.org/guides/mini/guide-building-for-different-environments.html

答案 2 :(得分:1)

如果您想要真正的运行时控制,那么您可能需要进行一些自定义编码。过滤器(或者,我想,servlet本身)可以检查属性的值并返回带有HTTP错误代码的响应(我认为403会非常合适; 404则不那么合适;但如果你希望它看起来好像servlet在该配置中不存在,它可以工作......)