2017-03-07 34 views
3

可以说我有一个简单的“Hello world”类型的servlet,配置了注释@WebServlet("/hello")在build/package/deploy中禁用servlet,在运行时启用?

我想禁用它的构建/部署,所以它不可能“调用”该servlet。我会怎么做?

然后,通过一个配置文件,我希望能够在运行时使servlet的,因此它可以被客户端使用。我会怎么做?

是这些可能吗?

回答

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

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

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

+0

这绝对是我考虑过的一种可能性,但是因为在封装时很容易选择多个'web.xml'文件中的一个, WAR文件,但我不知道是否可以在运行时或如何进行选择。 –

+0

@Someprogrammerdude请参阅我的编辑。 – Andres

1

如果你想要真正的运行时控制,那么你可能需要做一点自定义编码。一个过滤器(或者我猜想,servlet本身)可以检查一个属性的值并返回一个带有HTTP错误代码的响应(我想403会是模糊的; 404更不会这样,但是如果你想让它看起来像该servlet不存在于该配置中,它将工作...)